2014-01-24 2 views
7

C++에서 일부 공유 라이브러리를 만들어야하고 Linux를 개발자 운영 체제로 사용했습니다. dlsym/LoadLibrary을 통해 심볼을로드하려는 경우 심볼을 표시 할 필요가 있다는 것을 알고 있습니다. 그래서 리눅스에서 내 모든 기호는이 패턴 다음 : 내가 사용할 C++ 11 연타를 사용Windows 및 Linux에서 [gnu :: visibility ("default")]] vs __declspec (dllexport)

extern "C" [[gnu::visibility("default")]] void f(); 

를하고 나는 나의 호스트 프로그램에 f을로드 할 수 있었다. 내가 윈도우즈로 옮겼을 때 나는 C++ 11이 가능하도록 GCC 4.8.2를 사용했고 패턴은 윈도우 머신에서도 LoadLibrary으로 작동했다. (새로운 속성 구문에 C++ 11을 사용해야했습니다.) Windows에서 공유 라이브러리에서 심볼을 내보내려면 __declspec(dllexport)을 사용해야한다는 것을 알고 있습니다. 그럼 이제 어떡하지? __declspec(dllexport)은 (는) 더 이상 필요 없습니까?

편집 :

나는 그 동의어가 (내가 생각하는) 것을 here을 발견 그래서 질문은이 __declspec(dllimport)에 대한 [[gnu::attribute]] 특정 대상에 대해 매크로와 ifdef의를 사용하지가 무엇입니까? 그것은가 자동으로 수출 모든 당신의 .dll에서 즉 -

답변

4

기호 표시는 dllexport에서 미묘하게 다르다 - 그리고 가장 큰 이유는 mingw/cygwin에서 Windows에서 .dll를 컴파일 할 때, 기본 behaviour of the linker이 옵션 -export-all-symbols 때문이다 기본적으로.

당신은 하나가 에 어떤 루틴을 하나 __declspec((dllexport)) 또는 __attribute((dllexport)).def 파일을 사용하거나 넣어이 동작을 변경할 수 있습니다

(단일 기호는 다음 반출하도록 지정하는 경우, 즉 수출하고 수출 선언 만 기호) . 라이브러리에 많은 심볼이있는 경우 dll로드시 성능이 크게 향상 될 수 있습니다. 당신이 동등한 C++ 속성을 사용하려면

는, 당신은 그래서 그래, 세계 수출에서 .dll을 유지하기 위해 dllexport를 사용

[[gnu::dllexport]]를 사용합니다.

마찬가지로 외부 루틴을 가져 오는 데 [[gnu:dllimport]]을 사용할 수 있습니다.

문서를 읽는 동안 조심하십시오. 실제로 말하면, dllexport 속성을 사용하면 덮어 쓰기 전까지는 visibility:default 동작을 트리거합니다.

관련 문제