>백엔드 개발 >C++ >C DLL에서 내보낸 함수 이름이 때때로 장식되는 이유는 무엇이며 장식되지 않은 이름을 어떻게 내보낼 수 있습니까?

C DLL에서 내보낸 함수 이름이 때때로 장식되는 이유는 무엇이며 장식되지 않은 이름을 어떻게 내보낼 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-12 09:30:02734검색

Why are C   DLL exported function names sometimes decorated, and how can I export undecorated names?

C DLL 내보내기: 장식된/엉킨 이름

C DLL 개발에서는 컴파일 후에 내보낸 함수 이름이 장식되지 않은 채로 나타날 것으로 예상됩니다. 그러나 추가 문자로 장식된 함수 이름을 만나면 문제가 발생할 수 있습니다.

장식의 원인

보이는 장식은 컴파일러의 이름 맹글링 프로세스의 결과입니다. C 코드를 컴파일할 때 컴파일러는 오버로드된 함수 또는 다른 컴파일 단위 전체에서 고유성을 보장하기 위해 함수 이름을 수정합니다. 이 맹글링에는 추가 문자와 기호가 포함됩니다.

프라그마 주석을 사용한 솔루션

모듈 정의 파일을 사용하지 않고 장식되지 않은 함수 이름을 내보내려면 pragma 주석을 삽입할 수 있습니다.

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

또는 장식된 함수 이름을 자동으로 얻으려면:

#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)

선언 지정자가 있는 동등한 Extern "C"

또 다른 접근 방식 선언 지정자와 함께 extern "C"를 사용하는 것입니다:

extern "C" void __declspec(dllexport) SomeFunction();

그러나 이 방법은 여전히 ​​동일한 장식된 함수 이름을 생성합니다.

접미사 제거

안타깝게도 모듈 정의 파일이나 pragma 주석을 사용하지 않으면 "=" 장식을 제거할 수 없습니다. 이 접미사는 함수의 데코레이팅된 버전을 나타냅니다.

C# 애플리케이션에 대한 해결 방법

데코레이트되지 않은 이름이 선호되지만 C#에서 P/Invoke 호출은 다음을 사용하여 계속 수행할 수 있습니다. 장식된 함수 이름. 이렇게 하려면 함수를 호출할 때 완전히 장식된 이름을 포함하세요.

위 내용은 C DLL에서 내보낸 함수 이름이 때때로 장식되는 이유는 무엇이며 장식되지 않은 이름을 어떻게 내보낼 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.