php 편집기 Baicao에서는 gcc(mingw32)를 사용하여 정적 라이브러리로 DLL을 컴파일하는 방법을 소개합니다. 개발 프로세스 중에는 다른 프로젝트에서 쉽게 호출할 수 있도록 정적 라이브러리를 DLL로 패키징해야 하는 경우가 많습니다. 정적 라이브러리로 DLL을 컴파일하기 위해 gcc(mingw32)를 사용하는 방법은 비교적 간단하며 특정 단계를 따르기만 하면 됩니다. 먼저 mingw32 및 gcc 컴파일러가 설치되어 있는지 확인하십시오. 그런 다음 명령줄에 gcc -shared -o libname.dll libname.a를 입력하여 DLL 파일을 생성합니다. 이렇게 하면 다른 프로젝트에서 사용할 수 있도록 정적 라이브러리를 DLL로 쉽게 컴파일할 수 있습니다.
질문 내용
외부 도구(예: cgo)로 생성된 정적 라이브러리가 있는데 libsecondary.a라고 부르겠습니다. "libsecondary.a"를 종속성으로 포함하면서 동적 라이브러리를 생성하려고 합니다. libsecondary.h에서 onprocessinit()라는 함수를 내보내고 dll_process_attach 이벤트에서 호출합니다.
공유 라이브러리 생성을 시도했지만 작동하지 않는 것 같습니다. x86_64-w64-mingw32-share-l. -lsecondary -static-libgcc -static-libstdc++ -static .dllmain.c
오류 출력은 다음과 같습니다. dllmain.c:(.text+0x9b): 'onprocessinit'에 대한 정의되지 않은 참조, 무슨 일이 일어나고 있나요?
헤더 파일 libsecondary.h입니다
으아악dllmain.c입니다
65be0f35ebbcbc내보낸 golang 함수입니다(go build -buildmode=c-archive를 사용하여 컴파일한 함수)
/* code generated by cmd/cgo; do not edit. */ /* package command-line-arguments */ #line 1 "cgo-builtin-export-prolog" #include <stddef.h> #ifndef go_cgo_export_prologue_h #define go_cgo_export_prologue_h #ifndef go_cgo_gostring_typedef typedef struct { const char *p; ptrdiff_t n; } _gostring_; #endif #endif /* start of preamble from import "c" comments. */ /* end of preamble from import "c" comments. */ /* start of boilerplate cgo prologue. */ #line 1 "cgo-gcc-export-header-prolog" #ifndef go_cgo_prologue_h #define go_cgo_prologue_h typedef signed char goint8; typedef unsigned char gouint8; typedef short goint16; typedef unsigned short gouint16; typedef int goint32; typedef unsigned int gouint32; typedef long long goint64; typedef unsigned long long gouint64; typedef goint64 goint; typedef gouint64 gouint; typedef size_t gouintptr; typedef float gofloat32; typedef double gofloat64; #ifdef _msc_ver #include <complex.h> typedef _fcomplex gocomplex64; typedef _dcomplex gocomplex128; #else typedef float _complex gocomplex64; typedef double _complex gocomplex128; #endif /* static assertion to make sure the file is being used on architecture at least with matching size of goint. */ typedef char _check_for_64_bit_pointer_matching_goint[sizeof(void*)==64/8 ? 1:-1]; #ifndef go_cgo_gostring_typedef typedef _gostring_ gostring; #endif typedef void *gomap; typedef void *gochan; typedef struct { void *t; void *v; } gointerface; typedef struct { void *data; goint len; goint cap; } goslice; #endif /* end of boilerplate cgo prologue. */ #ifdef __cplusplus extern "c" { #endif extern __declspec(dllexport) void onprocessinit(); #ifdef __cplusplus } #endif
Solution
와우, 답은 인수 위치입니다,
x86_64-w64-mingw32 -shared -static-libgcc -static-libstdc++ -static .dllmain.c .libsecondary.a
뒤로 입력하면 libsecondary.a에서 참조를 찾을 수 없습니다. 맙소사...
위 코드는 syscall.NewLazyDLL이 LoadLibraryA를 호출하고 DLL_PROCESS_ATTACH에 잠겨 있기 때문에 로드 시 교착 상태에 빠지므로 해결 방법은 CreateThread를 사용하고 스레드 내에서 golang 내보낸 함수를 실행하는 것입니다. :)
위 내용은 gcc(mingw32)를 사용하여 정적 라이브러리로 DLL 컴파일의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

gohandlesinterfacesandtypeassertionsefectively, codeflexibleandrobustness.1) typeSertionsOncaLownallowRuntImeTypeChecking, asseengehapeInterfaceAndCircLetype.2) TypeStwitchEshandleMultipleTypesePesePesePesePesePese -pervariousShapesimplementing Gry

GO 언어 오류 처리는 오류와 오류를 통해 더욱 유연하고 읽을 수 있습니다. 1.Errors.is는 오류가 지정된 오류와 동일한 지 확인하는 데 사용되며 오류 체인의 처리에 적합합니다. 2. 오류. 오류 유형을 확인할 수있을뿐만 아니라 오류를 특정 유형으로 변환 할 수 있으며 오류 정보 추출에 편리합니다. 이러한 기능을 사용하면 오류 처리 로직을 단순화 할 수 있지만 오류 체인의 올바른 전달에주의를 기울이고 코드 복잡성을 방지하기 위해 과도한 의존성을 피하십시오.

TomakeGoApplicationSRUNFASTERONDERFISTING, 사용 프로파일 링 툴, leverageConcurrency, andManageMemoryEffice.1) usepprofforcpuandMemoryProfingToIndifyBottLenecks.2) UtizeGoroutinesandChannelStoparAllelizetAskSandimProvePercormance.3) 3)

GO'SFUTUREISBRIGHTWITHTRENTRENDIMPROVENTTOOLING, 제네릭, 클라우드-나비 탑 션, 퍼포먼스 엔지니즘 및 WebassemBlyIntegration, butchAllEngesIncludEmainingSimplicityAndIndimprovingErrorHandling.

GOROUTINESAREFUCTIONSORMETHODSTRUCHURNINGINGONO, ENABLEGINGEFICENDSTRUCHERTHENCERENCY.1) thearManagedBy 'sruntimeusingmultiplexing, 2) GoroutinesImprovePperformanceSytaskParallelizationAndeff

theinitfunctioningoistoinitializevariable, setupconfigurations, orperformnecessarysetupbeforethemainfunecutes.useinitecutes.useinitby : 1) placingItinyOUrCodetorUnaUtomalityBeforeMain, 2) KAIGITSHORTANDFOCUSEDONSIMPLETASKS, 3)

grointerfacesaremethodsignatures thattypesmustimplement, modularCode를 통해 polymorphism, modularCode.theyareimply에 만족하고, 유용한 ortoflexeApisandDecoupling, butrequeRecarefulusetoavoidRuntimeErrorsAndeAntorsAntafeTeAfer.

PANIC에서 복구로 이동하는 복구 () 함수를 사용하십시오. 구체적인 방법은 다음과 같습니다. 1) reygre ()를 사용하여 프로그램 충돌을 피하기 위해 연기 기능에서 공황을 포착하십시오. 2) 디버깅에 대한 자세한 오류 정보를 기록합니다. 3) 특정 상황에 따라 프로그램 실행을 재개할지 여부를 결정합니다. 4) 성능에 영향을 미치지 않도록주의해서 사용하십시오.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!
