gccはpthreadにリンクできませんか?


17

最近XUbuntu 11.10 64ビットをインストールしましたが、最も単純なpthreadの例をコンパイルするのに問題があります。

コードはpthread_simple.c次のとおりです。

#include <stdio.h>
#include <pthread.h> 
main()  {
  pthread_t f2_thread, f1_thread; 
  void *f2(), *f1();
  int i1,i2;
  i1 = 1;
  i2 = 2;
  pthread_create(&f1_thread,NULL,f1,&i1);
  pthread_create(&f2_thread,NULL,f2,&i2);
  pthread_join(f1_thread,NULL);
  pthread_join(f2_thread,NULL);
}
void *f1(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f1: %d",i);
  pthread_exit(0); 
}
void *f2(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f2: %d",i);
  pthread_exit(0); 
}

そして、これがコンパイルコマンドです

gcc -lpthread pthread_simple.c

結果:

lptang @ tlp-linux:〜/ test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o:関数「main」内:
pthread_simple.c :(。text + 0x2c): `pthread_create 'への未定義の参照
pthread_simple.c :(。text + 0x46):「pthread_create」への未定義の参照
pthread_simple.c :(。text + 0x57):「pthread_join」への未定義の参照
pthread_simple.c :(。text + 0x68): `pthread_join 'への未定義の参照
collect2:ldが1つの終了ステータスを返しました

誰が問題の原因を知っていますか?


最初の2行に空のインクルードがあるのはstackexchangeのせいですか?あるはずです#include <pthread.h>
-Frg

はい、事前環境を使用しました。これで正しく表示されるはずです。
chtlp


ところで、でコンパイルしてください-Wall、ヘッダーがありません。(そしてsr_は正しいです。)
マット

回答:


26

gccコンパイラの最新バージョンでは、ライブラリがオブジェクトまたはソースファイルに従う必要があります。

これをコンパイルするには、次のようにする必要があります。

gcc pthread_sample.c -lpthread

通常、pthreadコードは次のようにコンパイルされます。

gcc -pthread pthread_sample.c

1
@Karlson pthread.hgccが参照を解決するのにファイルを含めるだけでは不十分な理由を説明してください。
クアジイルファン

2
@iamcreasy宣言は定義と同じではないからです。プログラムは、特定の機能を実行するコードがどこにあるかを知る必要があります。
カールソン


0

次のコマンドを使用してコードをコンパイルします

gcc filename.c -lpthread -lrt

1
こんにちは!回答を編集して、なぜ機能するのかを説明し、既に受け入れられている回答ではカバーされない何かを追加すると思われる理由を強調することができれば役立ちます。
dhag
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.