2009-10-06 4 views
3

공유 라이브러리를 빌드하는 C 프로젝트에서 특정 함수와 구조체를 선택적으로 내보내는 크로스 플랫폼 방식이 있습니까?교차 플랫폼 방식으로 공유 라이브러리 심볼 내보내기?

GCC와 MSVC가 이해할 수있는 방식으로 특정 빌드 시스템 (코드에서 가시성을 매크로로 정의해야 함)을 필요로하지 않는 방식으로하고 싶습니다.

감사합니다.

+0

... 복사/붙여 넣기? – pmg

+0

이것을 확인하십시오 : http://stackoverflow.com/questions/2164827/explicitly-exporting-shared-library-functions-in-linux –

답변

4

엄밀히 말하면, 물론, 툴 체인이 동일하지 않기 때문입니다.

하지만 사람들은 이렇게합니다. 복잡성은 창에, 특별히 당신이 기능은 클라이언트 코드 곳의 위치 에서 정의__declspec(dllimport)입니다 라이브러리에있는 위치에 __declspec(dllexport)와 DLL에서 수출하려는 함수의 선언에 태그를 에 필요하다 기능은 이고, 참조 번호는입니다. 표준 C 연습은 단일 헤더 파일에 하나의 선언 만 있으므로이 은 일반적으로 두 위치에서 모두 작동하는 단일 접두사를 갖기 위해 일부 매크로 작업을 수행해야한다는 것을 의미합니다. 은 모든 프로젝트에서 이와 같은 자체 표준을 선택하는 것처럼 보입니다.

유닉스 쪽에서는 내보내기에 태그를 지정할 필요가 없습니다. 비 정적 기능이 기본적으로 내보내 지므로 은 그리 좋지 않습니다. 비공개/비 정적 기호에는 대부분의 프로젝트가 수행하는 것으로 보이는 접두어가 붙지 않는 한 종종이 문제를 해결할 수 있습니다. 내 보낸 심볼을보다 세밀하게 제어해야하는 경우 GNU 링커의 --version-script (-M under solaris) 인수와 함께 Solaris 스타일의 "mapfile"을 사용하여 외부 네임 스페이스에 으로 표시 할 심볼을 명시 적으로 정의 할 수 있습니다 .

라이브러리 별 전역 네임 스페이스가 작동하는 방식과 시작/종료 코드를 처리하는 방식과 같이 플랫폼간에 몇 가지 차이점이 있습니다. 기본적으로, 은이 짧은 글에서 설명 할 수없는 쥐의 둥지입니다. 그러나주의 할 때, 라이브러리에 단순한 함수가 포함되어 있고 네임 스페이스가 오염되지 않도록 오염되지 않아야합니다. 수고. 안내를 위해 인기있는 교차 플랫폼 공유 라이브러리 (예 : Qt, Glib/Gtk +, , msys와 함께 배포 됨)를 살펴보세요.

관련 문제