4

I 오전 쓰레드 라이브러리를 POSIX, 내가 가진 튜토리얼 샘플 코드를 컴파일하려고 할 새로운 :, g ++ 컴파일러 오류 "정의되지 않은 참조를"세마포어 호출

g++ -lpthread agreement.cpp -o agreement 

그러나 나는 코드를 컴파일 할 수 없습니다 및 다음과 같은 오류 메시지가 있어요 :

a3q2.cpp:(.text+0x7e): undefined reference to `sem_open' 
a3q2.cpp:(.text+0xab): undefined reference to `sem_wait' 
a3q2.cpp:(.text+0x290): undefined reference to `sem_post' 
a3q2.cpp:(.text+0x2af): undefined reference to `sem_close' 
a3q2.cpp:(.text+0x2bb): undefined reference to `sem_unlink' 
collect2: ld returned 1 exit status 
make: *** [a3q2_exe] Error 1 

내가 컴파일이 작동하려면 -lpthread 필요하다는 것을 알고,하지만 난 문제를 해결하기 위해해야 ​​할 다른 옵션이있다 ? 그렇지 않다면 "적절한"pthread 라이브러리를 어떻게 설치해야합니까?

도움 주셔서 감사합니다. (당신이 정말로의 pthreads를 사용하는 경우)

+3

사용합니다. pthreads 지원을 사용하여 컴파일하려면 라이브러리 이상이 필요할 수 있습니다. 당신의 플랫폼은 세마포어를 위해서'-lrt'를 요구할 것입니다 (당신은 man 페이지를 확인 했습니까?). –

+1

정의되지 않은 참조는 ** 링커 **이며 ** 컴파일러 ** 오류는 아닙니다. – Griwes

+1

또한 기호를 제공하는 객체 (및 아카이브)는 링크 할 때 해당 기호를 사용하여 * after * 객체로 정렬되어야합니다. 여기서 중요하지 않을 수도 있지만 * 시작 *이 아닌 명령의 * 끝 *쪽으로'-lfoo '를 넣는 습관을 갖습니다. – ephemient

답변

11

당신은 컴파일 옵션 -pthread를 원한다. 당신은 단지 그들이 librt에 이러한 기능이 필요하면 그래서 당신은 -pthread`가 아닌`-lpthread``원하는 -lrt

+0

감사 톤, 난 -pthread''로 문제를 해결할 수 있었지만 당신은 그 이유에 정교한 수 있을까? '-lpthread'와'-pthread'의 차이점은 무엇입니까? 감사합니다 – Mike

+1

@ 마이크 : 당신은 GCC의 맨 페이지에서 -pthread 보면 ".의 pthreads 라이브러리와 멀티 스레딩에 대한 지원을 추가이 옵션은 전처리와 링커 모두 플래그를 설정합니다." 정확한 플래그는 플랫폼마다 다를 수 있습니다. 시스템에, 그냥 "-lpthread"통과하는 것은 충분하지 않습니다 것을 의미한다 "-D__PTHREADS -lpthread -lrt"와 같은 무언가를 할 수있다. 원하는 모든 플랫폼에서 정확히 무엇이 매핑되는지 파악하고 그 대신에 이유를 전달할 수 있습니다. – abarnert

+0

@ 마이크 : 그 꼭대기에, "GCC 호환성 모드"에서 다른 컴파일러 (나는 ICC을 생각) 또한이 경우 주위에 최종 실행 그래서, 당신은 수, 일부 코드 생성 및/또는 최적화 의사 결정에 영향을 -pthread 사용할 수 있습니다 끝까지 컴파일하고 링크하지만 백만 번에서 1 회 충돌합니다 ... – abarnert

관련 문제