2009-05-05 5 views
1

저는 Linux 및 Mac OS X에서 컴파일해야하는 라이브러리에서 작업하고 있습니다. 지금까지는 "-g"로 컴파일하는 것이 두 운영 체제 모두에서 잘 작동했습니다.Mac에서만 -O2를 사용하여 컴파일 할 때 정의되지 않은 기호

좀 최적화 ("-O2")로 컴파일 시도하고 잘 리눅스에서 작동하지만 내가

사람을합니까 맥 OS X의에서 내 라이브러리와 프로그램을 연결하려고 할 때 정의되지 않은 심볼을 얻을 내가 찾아야 할 단서가 있습니까?

/usr/bin/gcc -std=c99 CMakeFiles/prod-cons.dir/prod-cons.c.o -o prod-cons -rdynamic -L/home/claferri/dev/build/src ../src/libckaapi.a -lpthread -Wl,-rpath,/home/claferri/dev/build/src 
: 여기
154:00000018 C _the_symbol 
377:   U _the_symbol 

이 라이브러리를 사용하여 프로그램에 대한 리눅스에서 컴파일 라인 :

nm mylib.a | grep _the_symbol 

이 리눅스 및 Mac 용 같은 일 (어떤 리눅스에서 밑줄 선도)를 반환

및 Mac :

/usr/bin/gcc -std=c99 -Wl,-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/prod-cons.dir/prod-cons.c.o -o prod-cons -L/Volumes/Data/claferri/Work/build/src ../src/libckaapi.a /usr/lib/libpthread.dylib 
+0

링커 오류를 나타내는 Mac 버전의 nm은 라이브러리에 심볼이 있음을 보여 줍니까? –

+0

예! 나는 무슨 일이 일어나고 있는지 알 수 없다. – claf

+0

"_the_symbol"이 (가) 소스 코드에 나타나며 초기화되지 않은 전역 변수입니까? 당신의 소스 코드에서 참조 되는가? –

답변

0

다음은 추측이며, 사용중인 정확한 컴파일러 플래그를 제공 할 때까지는 말할 수 없습니다. 그러나 Xcode의 기본값은 -fvisibility=hidden으로 설정되어 라이브러리의 심볼을 거의 숨길 수 있습니다 , 그것이 보이는 것으로 선언되지 않은 한.

Linux에서도 동일한 작업을 수행 할 수 있지만 GCC의 기본값은 기호를 숨기지 않는 것입니다.

당신은 여기에 더 많은 정보를 찾을 수 있습니다 : http://gcc.gnu.org/wiki/Visibility

+0

Xcode를 사용하여 컴파일하지는 않지만 두 OS 모두에서 CMake를 사용한다. – claf

1

여기 해결에서 추측 다음 -fno-일반적인 플래그 라이브러리를 구축하려고합니다. 이 변수에 대해 여러 정의가있는 경우 하나만 제외하고 모두에 "extern"을 추가해야합니다.

+0

나는 여러 변수를 여러 번 정의했고 -fno-common을 사용하는 것이 매우 유용하다는 것을 알았지 만 (사실은 코드 부분이 아니기 때문에), 재미 있지는 않지만 정의되지 않은 변수는 아닙니다. 먼저 ... 다른 변수들에 대한 extern 정의로 컴파일하는 것 같습니다. 고맙습니다! – claf

+0

실제로 -fno-common을 제거하면 여전히 같은 오류가 발생합니다 ... Linux에서 작동하고 Mac에서는 작동하지 않는 이유를 알지 못합니다. – claf

+0

다른 생각으로는 관련이있을 수 있습니다. * .a 아카이브의 * .o 파일 순서. "nm -A mylib.a | grep the_symbol"의 출력을 게시 할 수 있습니까? 아마도 참조를 포함하는 객체 파일 다음에 정의가 들어있는 객체 파일을 이동하면 링커가 올바른 작업을 수행하는 데 도움이됩니다. –