1. ホーム
  2. C++

Linux の 'pthread_create' への未定義参照問題を解決しました。

2022-01-23 18:48:31

Linuxでスレッドプログラミングモジュールに出会ったのですが、gcc sample.c(本に載っているサンプルコードをsample.cファイルに書くのに慣れています)では "undefined reference to 'pthread_create '" となってしまい、スレッドに関するすべての関数にこのエラーが発生してコンパイルができません。

原因:pthreadはLinuxのデフォルトライブラリではないため、リンク時にphreadライブラリのbrother関数のエントリアドレスが見つからず、リンクに失敗する。

解決方法 gccのコンパイルに-lpthreadパラメータを追加すると解決します。

#include <stdio.h> 
#include <pthread.h> 
#include <unistd.h> 
pthread_t ntid; 
void printids(const char * s) 
{ 
    pid_t pid; 
    pthread_t tid; 
    pid = getpid(); 
    tid = pthread_self(); 
    printf("%s pid %u tid %u (0x%x)\n",s,(unsigned int)pid, 
            (unsigned int)tid,(unsigned int)tid); 
} 
void * thr_fn(void * arg) 
{ 
    printids("new thread: "); 
    return ((void *)0); 
} 
int main(void) 
{ 
    int err; 
    err = pthread_create(&ntid,NULL,thr_fn,NULL); 
    if(err ! = 0) 
        printf("pthread_create error \n"); 
    printids("main thread:"); 
    sleep(1); 
    return 0; 
}

root@daoluan:/code/pthreadid# gcc sample.c
/tmp/cc1WztL9.o: 関数 `main' にあります。
sample.c:(.text+0×83): `pthread_create' への未定義の参照
collect2: ld が 1 の終了ステータスを返した

root@daoluan:/code/pthreadid# gcc -lpthread sample.c
root@daoluan:/code/pthreadid# . /a.out
メインスレッド:pid 7059 tid 3078141632 (0xb778b6c0)
新規スレッド:pid 7059 tid 3078138736 (0xb778ab70)

記事終了 2012-07-15

トラブルメーカー・キッド http://www.daoluan.net/

Linux初心者で、今スレッドプログラミングを始めたところなのですが、GUN/Linuxプログラミングガイドにある例を入力しながらコンパイルすると、以下のようなエラーになりました。
pthread_create'への未定義の参照
pthread_join' への未定義の参照
問題の原因
pthread ライブラリは Linux のデフォルトライブラリではなく、接続には静的ライブラリ libpthread.a が必要です。したがって、pthread_create() でスレッドを作成するとき、および pthread_atfork() 関数を呼び出してフォークハンドラを作成するときにリンクされている必要があります。
問題解決
    コンパイル時に-lpthreadパラメータを追加する場合
    gcc thread.c -o thread -lpthread
    thread.c はソースファイルです。ヘッダーファイル #include<pthread.h> を追加することを忘れないでください。