2013-02-18 2 views
0

xcode 4.6의 기호를 숨기는 데 약간의 문제 또는 오해가 있습니다. 나는 웹에서 사방을 수색하고 동일한 문제점이있는 포스트를 찾아 낼 수 없다.xcode 4.6 기호 가시성

현재 나는 간단한 헤더 파일이 너무 함유 프레임 워크 프로젝트를 만들었습니다 : "기본적으로 숨겨져 기호가"YES로 전환하기 때문에 기능 만되는 것을 나는 확실히 만든 프로젝트 설정에서

class Test 
{ 
public: 

    Test(){} 
    Test(){} 
}; 

int a(int n) {return n;} 

__attribute__((visibility("hidden"))) int b(int n) {return n;} 

__attribute__((visibility("default"))) int c(int n) {return n;} 

class X 
{ 
public: 
    virtual ~X(); 
}; 

class __attribute__((visibility("hidden"))) Y 
{ 
public: 
    virtual ~Y(); 
}; 

class __attribute__((visibility("default"))) Z 
{ 
public: 
    virtual ~Z(); 
}; 

X::~X() { } 
Y::~Y() { } 
Z::~Z() { } 

int c와 클래스 z는 다른 프로젝트에서 내보내거나 볼 수 있습니다.

프레임 워크를 오류나 경고없이 만든 다음 테스트 용으로 코코아 응용 프로그램에 복사/추가합니다.

헤더 파일을 포함 할 수 있지만 모든 클래스와 함수에 액세스 할 수 있습니다.

내가 왜 잘못되거나 왜이 문제가 발생했는지 누군가가 설명 할 수 있기를 바랍니다.

관련

답변

1

귀하의 문제가, 당신은 헤더 파일 모든 것을 선언한다. 즉, 기호를 내 보내지 않은 경우에도 헤더 파일을 다른 파일로 가져올 때 이러한 기호는 헤더를 가져온 프로젝트에서 다시 작성되므로이 프로젝트에서 사용할 수 있습니다.

간단한 샘플로 설명 드리겠습니다. MyLib.h와 MyLib.c라는 두 개의 파일이 있다고 가정하십시오.

MyLib.h :

int add(int a, int b); 

MyLib.c : 당신은 지금 add에게 hidden 가시성을 제공하고 도서관 (MyLib)에 이르기까지 모든 컴파일하면

int add(int a, int b) { return a + b }; 

하면, 도서관이 어떤 기호가 없습니다 add (숨김)입니다. 결과적으로 다른 파일에 MyLib.h을 포함하고 거기에 add 함수를 호출 한 다음이 파일을 MyLib에 연결하면 링커에서 add에 대한 구현을 찾을 수 없다는 불만을 토대로 링커 오류가 발생합니다 H 파일의 선언 만 있습니다.) 당신이 헤더 자체에 기능 팩을하면

그러나, MyLib.h은 그래서 :

int add(int a, int b) { return a + b }; 

그리고 당신은 hidden 가시성을 add 제공, 라이브러리는 또한 add에 대한 어떤 기호가 없지만, 때를합니다 헤더를 다른 파일에 포함 시키면이 헤더는 정확하게 가져온 파일에 add의 심볼을 작성하므로 링커 오류가 발생하지 않고 add을 호출 할 수 있습니다.

H 파일 가져 오기는 가져 오기 명령이있는 위치로 H 파일의 전체 내용을 복사하는 것을 의미합니다. 이제 생각해보십시오. 질문에 포함 된 H 파일의 전체 내용을 파일의 맨 위에 복사하면 물론 거기에 선언 된 모든 기호가 현재 프로젝트에서 표시되고 사용할 수 있습니다. 왜 그들은 보이지 않거나 유용할까요?그들은 라이브러리에 없습니다. 그렇습니다. 그러나 헤더에 있으므로 다른 프로젝트가 컴파일 될 때 컴파일됩니다.

현재 프로젝트 외부에서 볼 수 없도록되어있는 기호 ("숨겨진 기호")는 프레임 워크의 공용 헤더 파일에 나타나지 않아야합니다. 어쨌든 사용할 수없는 헤더 파일에 심볼의 존재를 알리는 이유는 무엇입니까? 사실, 대부분의 경우 헤더 파일에 심볼을 표시하지 않으면 사람들이 사용하지 못하도록 이미 충분합니다. 그 중 하나를 내보낼 수없는 이유는 심볼이 존재하는 경우에만 헤더 파일에 의해 노출되지 않아도 사용할 수 있기 때문입니다. 따라서 헤더 파일을 직접 작성하거나 external 심볼로 직접 선언해야합니다. 암호). 따라서 기호를 숨기려면 어떤 상황에서도 사용할 수 없도록하는 것이 안전 장치 일뿐입니다.

+0

감사합니다. 물론 Mecki는 완전히 바보입니다 (두뇌가 튀었지만 변명의 여지가 없습니다). 나는 내가이 사과 페이지 (https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html)와 혼동을 겪고 있다고 생각한다. 헤더 파일에 있었거나 __attribute __ ((visibility ("default"))) 또는 무엇을 배치해야 하는지를 보여주는 jsut입니다. 그래서 함수 int를 인라인했다면 예를 들어 숨겨져 있을까요? – themadme

+0

'inline' 함수를 선언했지만 여전히 헤더에 삽입하면, 헤더가 포함 된 곳이면 어디에서나 볼 수 있습니다. 라이브러리 밖에서 보이지 않는 기능을 만들고 싶다면'hidden'으로 선언하고 그것이 프레임 워크 번들의 헤더 파일에 나타나지 않는지 확인하십시오. 프레임 워크의 파일에만 표시되지만 프레임 워크 번들에 복사되지 않으므로 프레임 워크에 링크되는 프로젝트에는 보이지 않는 개인 H 파일을 사용하십시오. – Mecki

+0

지혜 Mecki에게 다시 한 번 감사드립니다. 이제는 집에 돌아가서 내 Windows 프로젝트를 Mac으로 변환하고 Linux를 계속 사용하기를 기다릴 수 없습니다. 다시 한 번 감사드립니다. – themadme

관련 문제