2017-09-05 15 views
2

내가 util을 모듈 foo는으로 구성되어 있으며 다음과 같은 소스 트리가있는 라이브러리 foo는이 있다고 가정 foo.h에 정의되고 모든 전역 식별자는 foo_ 또는 util_으로 올바르게 접두어로 지정됩니다. 모듈 foo에 의해서만 사용됩니다. 다른 모듈과 이름 충돌을 막으려면 모듈 foo의 식별자 만 볼 수있는 (정적) 라이브러리를 만들고 싶습니다. 어떻게해야합니까?숨기기 비 API 기호

편집 : 인터넷을 상당히 광범위하게 검색했지만 놀라 울 정도로 이것은 컴퓨터 과학의 미해결 문제 중 하나 인 것으로 보입니다.

답변

0

util.h 내의 각 변수 및 함수 선언은, 예를 들어 라이브러리 프리픽스 foo_ 추가하여 선언 식별자를 바꾸고 매크로 일정한 장소에서 이러한 정의, 코드의 다른 부분과

#define util_x foo_util_x 
extern int util_x; 

#define util_f foo_util_f 
void util_f(void); 

... 

를 정의하기 전에 개체 파일 util.o의 모든 전역 기호는 접두사 foo_이됩니다. 즉, 이름 충돌이 발생할 가능성이 적습니다.

2

이 아마 다른 가능한 방법이지만, 여기에 하나 :

당신은 foo.c 내 파일 util.c을 포함한 모든 폴더의 유틸리티 기능/전역 정적 만드는 고려할 수 있습니다. 즉 :이 foo.c*.h 파일, 그것은 단순히 포트 전체 소스로 동일하게 작동

#include "util.c" 
// ... 

, util.c 중첩 모든 정적 데이터를 사용할 수 있도록. 나는이 작업을 수행 할 때

, 나는 그것이 어셈블러와 충돌 할 수 있지만 그것은, 내가 어딘가에 집어 이전 협약 ... .inc (즉 util.c => util.inc)에 파일 ...

#include "util.inc" 
// ... 

의 이름을 변경 파일이므로 자신의 재량에 따라 사용해야합니다.

편집

또 다른 방법은 링커 특정 지침이 필요할 수 있습니다. 예 : this SO answer details GNU's ld to achieve this goal. 동일한 접근법에있는 다른 접근 방식도 있습니다.

+0

흥미로운 접근 방법입니다. 그러나, 나는 객체 파일 수준에서 작동하는 솔루션을 선호합니다. –

+0

@AugustKarlstrom이 기본 설정을 확실히 이해할 수 있습니다. 그러나 이것은 링커 고유의 솔루션이라고 생각합니다. 세부 사항으로 내 대답을 편집했습니다. – Myst

+0

링크 된 GNU ld 접근 방식은 내 보낸 기호 파일을 수동으로 관리해야합니다. 나는 util.o의 모든 심볼이 숨겨져 있어야한다고 말할 수 있어야합니다. –

0

다음은 GCC 관련입니다.

당신은 다른 공유 객체에 링크되는 것을 방지 할 수

__attribute__((visibility ("hidden"))) 

각 유틸리티 기능을 표시 할 수 있습니다.

당신은

#pragma GCC visibility push(hidden) 
/* ... */ 
#pragma GCC visibility pop 

로 주변으로 선언하는 일련의에이를 적용하거나 명시 적 가시성 (예를 들어, __attribute__((visibility))#pragma GCC visibility도)없이 선언에 적용되는 객체를 컴파일 할 때 -fvisibility=hidden를 사용할 수 있습니다.