컴파일하는 동안 -pthread와 -lpthread의 차이점


답변:


116

-pthread 컴파일러에게 pthread 라이브러리에서 링크하고 스레드에 대한 컴파일을 구성하도록 지시합니다.

예를 들어 다음은 -pthreadUbuntu 컴퓨터에 설치된 GCC 패키지 에서 옵션이 사용될 때 정의되는 매크로를 보여줍니다 .

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt 
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1

-lpthread옵션을 사용하면 pthread 라이브러리가 연결될뿐입니다. 미리 정의 된 매크로는 정의되지 않습니다.

결론 : -pthread옵션을 사용해야합니다 .


참고 :이 -pthread옵션은 GCC 문서에서 플랫폼 별 옵션으로 문서화되어 있으므로 항상 사용할 수있는 것은 아닙니다. 그러나 GCC 문서에 명시 적으로 나열되지 않은 플랫폼 (예 : i386 및 x86-64)에서 사용할 수 있습니다. 사용 가능한 경우 사용해야합니다.

또한 -pthreads( -pthreadSolaris 2에 대한 동의어로 나열 됨 ) 및 -mthread(i386 및 x86-64 Windows에서 MinGW 특정 스레드 지원용 )과 같은 다른 유사한 옵션이 GCC에서 사용되었습니다 . 내 이해는 GCC가 -pthread앞으로 균일하게 사용하려고 노력하고 있다는 것입니다.


2
POSIX와 직접적으로 모순되기 때문에 이상합니다. POSIX는 패스 -lpthread가 전체 POSIX 스레딩 라이브러리를 얻기에 충분 하도록 요구합니다 .
fuz

@FUZxxl Passing -lpthread 전체 POSIX 스레딩 라이브러리를 가져옵니다.
user253751

5
@immibis 아니, 내 말은 POSIX는 링크가 -lpthread전체 pthreads 지원을 받기에 충분해야 한다고 말합니다 . 다른 컴파일 플래그는 필요하지 않습니다.
fuz

1
@alecov gcc의 문제점은 이전 의견에서 이미 명확히 한 것처럼 pthread 지원을 받기에는 충분하지 -lpthread않지만 컴파일하는 -pthread것이 불충분하다는 것입니다.
fuz

2
@alecov POSIX는 POSIX 환경을 구성하고 -lpthread. 그러나 gcc 문서는 이것이 pthreads 지원을 받기에 충분하지 않을 수 있다고 제안합니다. 나는 당신이 제공하지 않거나 -lpthread임의의 다른 독점 옵션을 제공하지 않으면 어떤 일이 발생하는지 전혀 신경 쓰지 않습니다 . 만 -lpthread보증의 pthreads에 POSIX에 의해 지정되고 그 GCC와 충분한 것 같다하지 않습니다.
fuz

10

-pthreadpthreads 라이브러리로 멀티 스레딩 지원을 추가합니다. 이 옵션은 전처리 기와 링커 ( man gcc) 모두에 대한 플래그를 설정합니다 .

동안

-lpthread 링크하는 동안 존재하는 것은 전처리 중에 영향을 미치지 않습니다.


4

허용되는 대답이 있지만 IMO는 충분한 컨텍스트와 통찰력을 제공하지 않습니다. 따라서이 추가 답변.


-lpthread 더 이상 존재하지 않는 문제에 대한 해결책입니다 (~ 2005 년 이후).

예전에는 LinuxThreads 와 같이 POSIX와 호환되지 않는 Pthreads API 의 독점적 구현이있었습니다 . POSIX 표준은 단순히 POSIX 호환 동작을 원한다면 Pthreads API의 POSIX 호환 구현을 링크하는 데 필요한 링크 및 링크가 필요하다고 말합니다 .-lpthread

최신 운영 체제에는 Pthreads API의 다중 구현이 없습니다. 그리고 그것이 -lpthread더 이상 어떤 목적도 제공하지 않는 이유 입니다.


컴파일러와 같은 gccclang(와, 아마, 리눅스 호환 컴파일러)가 필요 하여 -pthread모두 컴파일하고 POSIX 호환 멀티 스레드 애플리케이션을 연결하고 하나는 사용해야합니다 무엇에 대한 명령 줄 옵션을.

컴파일 시간에 -pthread옵션은 Pthread API가 요청되었음을 명시하고 (예 : Solaris Threads와 같은 다중 스레딩 API가있을 수 있음) 플랫폼 별 매크로를 정의합니다 ( _REENTRANTLinux에서 , _MTSolaris에서).

링크 타임에 -pthreadPOSIX 호환 Pthreads API 동작을 구현하는 필수 라이브러리 (있는 경우)의 링크.

위의 내용은 왜 -lpthread필요하지도 충분하지도 않은지 명확하게 보여줍니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.