2012-01-20 1 views
0

C 라이브러리를 컴파일하려고하는데 외부 C 코드가 좋아서 라이브러리의 심볼을 찾는 외부 코드에 문제가 있습니다. 나는 큰 영화를 이해하지 못하고 누군가가 도울 수 있기를 바라고 있습니다. 세부 사항은 다음과 같습니다.외부 라이브러리에 연결할 때 심볼 이름에 언더 바아

1) 저는 Mac에서 일하고 있습니다. xcode에 정적 .a 라이브러리로 라이브러리를 컴파일했습니다.

2) 라이브러리에서 함수를 호출하는 외부 코드를 컴파일하려고합니다. 헤더 파일을 포함 시켰고 gcc 호출에서 위치와 라이브러리를 지정했습니다. 컴파일이 정상적으로 완료된 것처럼 보이지만 링크가 실패하면 심볼을 찾을 수 없다는 오류가 발생합니다.

3) 누락 된 기호는 FunctionName이 내가 호출 한 함수의 이름 인 _FunctionName으로 나열됩니다.

왜 컴파일러/링커가 내 함수 이름에 언더 바를 추가했는지 분명하지 않습니다. 하지만 내 순진한 추측은 그것이 도서관에서 기호를 찾을 수없는 이유입니다.

외부 코드 컴파일은 백그라운드에서 gcc 호출을 수행하는 MATLAB의 mex() 함수를 통해 수행됩니다.

누구나 갖고있는 생각에 감사드립니다.

gcc-4.2 -c -Igsf_0303/ -I/Applications/MATLAB_R2011b.app/extern/include \ 
-DMATLAB_MEX_FILE -fno-common -no-cpp-precomp -arch x86_64 -isysroot \ 
/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -fexceptions \ 
-DMX_COMPAT_32 -O2 -DNDEBUG "gsf_tester.c" 

gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl, \ 
-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,\ 
-exported_symbols_list,/Applications/MATLAB_R2011b.app/extern/lib/maci64/mexFunction.map \ 
-o "gsf_tester.mexmaci64" gsf_tester.o gsf_0303/libgsf.a \ 
-L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++ 

Undefined symbols: 
    "_gsfOpen", referenced from: 
     _mexFunction in gsf_tester.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

mex: link of ' "gsf_tester.mexmaci64"' failed. 
+0

은 무엇 이름 당신의 기호 라이브러리에 있나요의 구조를 확인? ('nm -g library.a'를 실행하여 파일 library.a에 내 보낸 모든 기호를 나열하십시오.) –

+1

밑줄을 붙이면 컴파일러가 컴파일시 C 함수의 이름을 지정하는 일반적인 방법입니다. 'mexFunction' 오류 메시지에서 볼 수 있듯이 또한 가지고 있습니다. 'gfsOpen'을 포함하고있는 파일이 정말 라이브러리에 추가 되었습니까? –

답변

0

다음은 추측입니다. 첫째, 요아킴의 의견은 정확합니다. C 함수 이름에는 항상 앞에 밑줄이 붙습니다. 그래서 그게 문제가 아니야.

따라서 gfsOpen()은 라이브러리에서 누락되었거나 표시되지 않거나 gfs_tester.o이 링크되어있는 경우 표시되지 않습니다.

그래서 gfsOpen이 라이브러리에 있는지 확인하십시오. 이 작업을 수행해야합니다

otool -t -v sgsf_0303/libgsf.a | grep gsfOpen 

위의 파일을 분해 한 다음 관심있는 심볼을 greps합니다. 아마 더 좋은 방법이 있을지 모르지만 나는 그것을 연구하기 위해 귀찮게하지 않았습니다.

확인되지 않았는지 확인하십시오. static.

라이브러리 일치 ( otool -fv)

+0

빠른 답변을 보내 주셔서 감사합니다. 필자가 제안한 도구를 사용하여 실제로 gsfOpen이 기호 테이블에 없다는 것을 알았습니다. 이것은 내가 실제로 내 라이브러리에 집계 한 것에 대한 추가 조사를 유도합니다. 나는 라이브러리를 테스트하기 위해 또 다른 코드를 만들었고 실수로 라이브러리를 컴파일했을 때 프로젝트의 파일 목록에 포함되었습니다. 이것을 제거한 후 컴파일을하고 오류없이 MATLAB에서 함수를 컴파일하고 실행할 수있었습니다. 나는 어리 석음에 대한 세부 사항을 이해하지 못한다. 그러나 나는 당신의 도움에 감사하고 그 일에 감사하고있다. – vschmidt

+0

@ user2932 : 아마도 자신의 질문에 대한 답변을 댓글 텍스트와 함께 만들어서 받아 들여야합니다. 그렇게하면 같은 문제에 대한 답을 찾고있는 누군가가 당신의 솔루션을보다 쉽게 ​​찾을 수 있습니다. – JeremyP