2009-11-09 3 views
7

내가 가지고있는 프로젝트를 만들려고하고 있으며 여러 가지 내 보낸 기능이 있습니다. 기능은 stdcall을 규칙을 따라GCC에서 내보내기 이름 변경 계획을 변경하는 방법이 있습니까?

[email protected] 

다른 컴파일러로 GCC로 컴파일 한 경우에는 다음과 같이 이름을 난도질 난도질 얻을 :

[email protected] 

내가 이름을 탈수하는 GCC를 강제 할 수있는 방법이 있나요 나중에 예제로 함수를 내 보냈습니까?

답변

0

-fleading-underscore과 관련된 GCC 설명서를 참조하십시오. 그러나이 조치의 결과에 대한 경고를 읽으십시오. 그것은 당신이 생각하는 해결책이 아닐 수도 있습니다.

+0

답변을 주셔서 감사합니다. 작동하지 않는 것 같아서 C의 표준은 밑줄 문자를 사용하지 않으시겠습니까? 필자는 컴파일러들 사이에서 이식성을 높이려고 노력했다. 기능은로드해야하는 DLL의 수출이다. –

+0

코드를 C 또는 C++로 컴파일하고 있습니까? 컴파일러 상호 운용성을 위해 DLL은 C 인터페이스 만 제공해야합니다. C++을 사용할 수 있지만 인터페이스는 extern "C"로 선언해야합니다 (물론 C 호환 유형 만 사용하고 함수 오버로드는 사용하지 마십시오). – Clifford

0

Windows에서 함수 이름을 다루는 가장 좋은 방법은 항상 .def 파일을 사용하는 것입니다. 이것은 컴파일러에 상관없이 동일하게 작동합니다.

EXPORTS 
    Func1 
    Func2 
    ... 
4

this answer를 참조하십시오 : 일반적으로 당신은 단지 EXPORTS 섹션이 필요합니다.

int Func() __asm__("[email protected]"); 

이 관계없이 정상적으로했을 무엇을의 상징 [email protected]의 이름을 GCC를 강제 할 것이다.


맞음, @은 기호 버전 관리에 사용됩니다. 나는 __asm__("[email protected]")가 작동하는 데 사용되는 줄 알았지 만, 더 이상 그렇지 않다고 생각합니다. 링크 할 때 gcc -Wl,--version-script=foo.version에게 주어진

1 { 
    global: 
    _Func; 
}; 

:

int Func() __asm__("_Func"); 
__asm__(".symver _Func, [email protected]"); 

이처럼 version script 파일과 함께 제공해야합니다.

+0

고마워,하지만 내가 뭔가 잘못하고있는 중이거나 작동하지 않는다. http://pastebin.com/f14a9a00f –