Linux の 'pthread_create' への未定義参照問題を解決しました。
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> を追加することを忘れないでください。
関連
-
undefinederror: 'dynamic_cast' の前に unqualified-id を指定する必要があります。
-
C++-サンプリング関数 GridSampling (要サンプリング高速化)
-
C++ - 文字列クラス超詳細紹介
-
エラー: "***"の前にイニシャライザーがあります。
-
error: '&' トークンの前にイニシャライザーがあるはずです。
-
エラー: コンストラクタ、デストラクタ、または '.' トークンの前に型変換が必要です。
-
const char*' から `char*' への変換が無効な場合の対処法
-
ISO C++ではポインタと整数の比較は禁止されています[-fpermissive]。
-
警告を表示します。ISO C++は文字列定数を'char*'に変換することを禁じています[-Write-strings]。
-
C/C++ におけるランダム関数 rand() および srand() の使用法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン