2017-02-12 4 views
-1

Apple LLVM 버전 8.0.0 (clang-800.0.42.1)을 사용하여 컴파일하고 있습니다. 그것은 약 1200 파일이지만, 전에 그들을 사용했습니다. 나는 가서 아무 문제도 일으키지 않는다. 그런 다음 정적 라이브러리 (ar rcs libblib.a *.o)를 만들면 문제가 없습니다. 그래서 새로운 라이브러리를 사용하려고하면 문제가 생깁니다.정적 라이브러리 링크 문제 정의 된 심볼에 대한 "정의되지 않은 심볼"

gcc main.c -L. -lblib 
Undefined symbols for architecture x86_64: 
    "_N_method", referenced from: 
     _main in main-7fc584.o 
ld: symbol(s) not found for architecture x86_64 

그러나 이것이 정의되어 있음을 알고 있습니다. 파일이 포함되어 있는지 (ar -t libblib.a | grep N_METHOD.o) 확인하고 거기에 있습니다. 소스 파일을 확인하십시오. 헤더 파일에있는 그대로 이름이 지정된 메소드가 있습니다. 내가 여기서 겪고있는 문제는 무엇인가? 나는 완전한 상실감에 빠졌고 나는 단순한 무언가를 놓치기를 바라고 있습니다.

나는 nm -g N_METHOD.o를하고 돌아 왔을 :

0000000000000000 T __Z8N_methodP6stacks 
+1

라이브러리가 C 또는 C++로 작성 되었습니까? C++이라면 이름이 엉망이됩니다. – Barmar

+0

@Barmar : C는 _methods_를 지원하지 않습니다. Occam의 면도기는 C++이라고 알려줍니다. – Olaf

+0

C입니다. N_method를 자리 표시 자로 사용하고 있습니다. – Red

답변

0

답변에 의견을 전송. 질문 내용을 바탕으로

, I 질문 :

  • 당신이 N_METHOD.o 64 비트 오브젝트 파일 (또는 32 비트 및 64 비트 코드와 지방 오브젝트 파일인지 확인해 봤어 그것에서)? 32 비트 오브젝트 파일이면 64 비트 프로그램에서는 사용하지 않습니다. 그러나, 그것은 거의 없을 것입니다. Mac에서 32 비트 오브젝트 파일을 만드는 방법을 벗어나야합니다.

  • nm -g N_METHOD.o을 실행하여 _N_method이 개체 파일에 정의되어 있는지 확인하십시오.

나는 nm -g N_METHOD.o를하고 돌아 왔을 :
0000000000000000 T __Z8N_methodP6stacks 

는 C++ 컴파일러와 C 코드를 컴파일하지 마십시오. 또는 C 컴파일러로 C++ 코드를 컴파일하지 마십시오. 맹 글링 된 이름 ( __Z8N_methodP6stacks)은 C++ 용입니다. 어쩌면 gcc 대신 g++으로 연결하면됩니까? 그들은 다른 언어입니다 - 컴파일 및 링크 -이 첫 번째 단계 C의 특징 ++와 C

완전히 알 수없는 '형태 보증 된 링크'의 속성입니다 : 소스한다고 가정

g++ main.c -L. -lblib 

C++의 하위 집합 (또는 C++의 C 하위 집합)에 있으면 작동 할 가능성이 있습니다. 코드에 N_Method(&xyz)이 포함 된 경우 적어도 의 변수 인 xyz이있는 경우 __Z8N_methodP6stacks을 호출 할 가능성이 있습니다.

다음 코드

0000000000000038 s EH_frame1 
       U _N_method 
0000000000000000 T _relay 
: 그것은 또한 C 컴파일러로 컴파일

0000000000000000 T __Z5relayP6stacks 
       U __Z8N_methodP6stacks 

nm -g 출력을 생성 :

typedef struct stacks stacks; 
extern int N_method(stacks*); 

extern int relay(stacks *r); 

int relay(stacks *r) { return N_method(r); } 

nm -g 출력을 생성하도록 컴파일러 ++는 C로 컴파일