2012-03-13 3 views
2

리눅스에서는 pthread와 main.c를 사용하는 공유 라이브러리가 있습니다.main.c가 pthread를 사용하지 않을 때 main.c 컴파일의 pthread에 명시 적으로 링크해야하는 이유는 무엇입니까?

libpthread.so가 내 공유 라이브러리의 ldd에 나타나는데 이것이 맞습니다. 내가 컴파일하지 내 공유 라이브러리의 pthreads를 사용하지 않는 내 main.c에 연결할 때

$ ldd libmapreduce.so.1.0 
    linux-gate.so.1 => (0x0067d000) 
    libpthread.so.0 => /lib/libpthread.so.0 (0x0058c000) 
    [...] 

는하지만, 내가 볼 :

$ icc -Wall -o main main.c -lmapreduce 
    /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `pthread_atfork' 

는, 즉, 내 컴파일 명령에

을 -lpthread 추가
$ icc -Wall -o main main.c -lmapreduce -lpthread 

은 정의되지 않은 참조를 해결합니다.

main.c가 libpthread를 사용하지 않고 공유 라이브러리에 이미 libpthread가 링크되어있는 경우 왜 libpthread에 명시 적으로 링크해야합니까?

답변

0

R ..와 Pavan Manjunath, 내가 파기를 계속하도록 격려해 주셔서 감사합니다.

처럼 보였다 libmapreduce.so 공유 라이브러리에 대한 링크 단계 :

-openmp 링크 플래그가 필요하지 않은 것을
icc -shared -g -o libmapreduce.so.1.0 map.o map_wrp.o -openmp [...] -lpthread -ldl 

사실이 pthread_atfork 명령 할 수있는 정의되지 않은 참조를 소개했다. pthread_atfork에 대한 정의되지 않은 참조가 공유 라이브러리 libmapreduce.so에 main.c를 연결하려고 시도 할 때까지 표시되지 않았습니다. -openmp 플래그를 사용하지 않고 libmapreduce.so를 다시 작성하면 문제가 해결되었습니다.

6

실행 파일이나 DLL을 만들려면 프로그램의 모든 종속성을 임시 클로저로 연결해야합니다. sharedlib에서 main.c가 링크되기 때문에 pthreads를 포함하는 sharedlib의 모든 의존성을 링크해야합니다.

+0

감사합니다. 나는 전에 어떻게 든 이걸로 돌아갈 수 없었습니다 ... –

+5

pthread를 필요로하는 공유 라이브러리가 올바르게 링크 되었다면, 메인 프로그램의 링크 커맨드 라인에서 그것을 필요로하지 않아야합니다. 하나 이상의 libs가 libpthread에 대한 참조가 아닌 주 프로그램에서 제공하는 정의되지 않은/처리 된 pthread 기호와 연결되어있는 것 같습니다. –

+0

@R .. 감사합니다. 나는 당신이 어떻게 진술해야하는지에 대한 질문에 대답했습니다. 나는 파기를 계속할 것이다. –