C DLL 내보내기: 장식된 이름과 장식되지 않은 이름
C DLL에서 함수를 내보낼 때 장식된(잘못된) 이름이 나타날 수 있습니다. 이 동작은 C에서 기호 이름을 확인하기 위한 컴파일러의 이름 조작 메커니즘에서 발생합니다.
모듈 정의 파일(.def)
모듈 정의 파일을 사용할 때 내보낸 함수의 이름을 명시적으로 지정합니다. 그러나 컴파일러는 내보낸 기호 이름에 장식된 접미사를 계속 추가합니다. 이는 함수의 인수, 반환 유형 및 기타 세부 정보에 대한 정보를 포함하는 함수 이름의 잘못된 버전입니다.
extern "C" Import
함수 내보내기 "extern "C"" 구문을 사용하면 컴파일러가 함수 이름을 이름 변경하는 것을 방지할 수 있습니다. 그러나 "="다음의 추가 접미사는 제거되지 않습니다.
Pragma Comment
함수를 명시적으로 내보내는 또 다른 접근 방식은 #pragma comment 링커를 사용하는 것입니다. 지령. 이 지시어를 사용하면 내보낼 장식된 함수 이름을 지정할 수 있습니다. 예를 들면 다음과 같습니다.
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
이 지시어는 제공된 데코레이팅된 이름으로 "SomeFunction" 함수를 내보내도록 링커에 지시합니다.
FUNCTION 매크로
또 다른 옵션은 함수 본문 내에서 FUNCTION 매크로를 사용하는 것입니다. 이 매크로는 장식되지 않은 함수 이름으로 확장됩니다. 그런 다음 pragma 주석 지시어를 사용하여 다음과 같이 장식된 이름으로 함수를 내보낼 수 있습니다.
#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)
이 기술을 사용하면 명시적으로 지정하지 않고도 장식된 이름을 지정할 수 있습니다.
By 이러한 접근 방식 중 하나를 따르면 내보낸 함수 이름을 제어하고 .def 파일이나 "extern "C"" 구문을 사용할 때 나타날 수 있는 원하지 않는 "=" 및 장식된 접미사를 피할 수 있습니다.
위 내용은 C DLL에서 내보낸 함수 이름을 제어하는 방법: 장식된 것과 장식되지 않은 것?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!