Linuxでのpthread_createへの未定義の参照


376

https://computing.llnl.gov/tutorials/pthreads/から次のデモをWebから入手しました。

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

しかし、自分のマシン(Ubuntu Linux 9.04を実行)でコンパイルすると、次のエラーが発生します。

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function main’:
term.c:23: warning: incompatible implicit declaration of built-in function exit
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

ヘッダが含まれているため、これは、私にはどんな意味がありませんpthread.h持っているべきで、pthread_create機能を。何が問題になっているのですか?


6
さらに、プラットフォームによっては、(a)スレッド用の別のコンパイラー、(b)スレッド用の別のlibc(つまり-lc_r)、(c)-threadなど-threads、の代わりに、またはに加えて、が必要になる場合があります-lpthread
ephemient 2009年

その例の少し上に、GCC、IBMなど、正しいコンパイラコマンドの表が表示されます。「Employed Russian」は正しいです。
Jonathon Reinhart

8
私の回答のマークを外して、私がそれを削除できるようにしていただけますか(そして実際に正しいもの、つまり最高投票数の回答にマークを付けます)?
Pavel Minaev 2012年

3
-lpthreadコンパイル中に必要です
どのようにChen

5
ソリューションLDFLAGS= -pthread -lpthread
dsnk 2015年

回答:


696

これまでのところ、この質問に対する答えはどちらも正しくありません
Linuxの場合、正しいコマンドは次のとおりです。

gcc -pthread -o term term.c

一般に、ライブラリはコマンドラインでソースとオブジェクトを追跡する必要-lpthreadがあり、「オプション」ではなく、ライブラリの仕様です。のみがlibpthread.aインストールされているシステムでは、

gcc -lpthread ...

リンクに失敗します。


2
+1このソリューションは機能しました...他のユーザーは機能しませんでした。また、「ライブラリはソースとオブジェクトに従うべきである」という提案は素晴らしいアドバイスです。引用や詳細な説明は素晴らしいでしょう。
sholsapp 2012年

7
ここ@sholsappは説明は次のとおりです。webpages.charter.net/ppluzhnikov/linker.html
就業ロシアの

これは、コマンドの最後に-lpthreadを配置するまで、エラーになります。gcc term.c -lpthread
CornSmith 2013

実際にlibpthread.aとlibpthread.soの両方を含んでいるUbuntu 14.04でsnortsamをコンパイルするときに問題が発生しました。私はなっていたundefined reference to 'pthread_cancel'undefined reference to 'pthread_create'のエラー。私はこのSOの投稿に出くわし、Employed Russianの答えを試してみようと思いました。makesnortsam.shVI を開いてコマンド:%s/lpthread/pthread/gを実行し、lpthreadをpthreadに置き換えて、コンパイル時に使用する-pthread代わりに使用できるように-lpthreadしました。その後、snortsamをコンパイルすることができました。ロシア人に感謝します!
dcarrith 14

5
CODEBLOCKSを使用している場合:-pthreadプロジェクトのビルドオプションに追加->リンカ設定->その他のリンカオプション。
user3728501

39

日食で

プロパティ-> c / c ++ Build->設定-> GCC C ++リンカー->上部のライブラリに「pthread」を追加


同じヒントがcode :: projectにも適用されます(他のIDEもそうだと思います)
Fil

19

Linuxターミナルから実行すると、次のコマンドを使用してコンパイルできました(コンパイルするcファイルの名前がtest.cであるとします)。

gcc -o test test.c -pthread

それが誰かを助けることを願っています!


19

Linuxの場合、正しいコマンドは次のとおりです。

gcc -o term term.c -lpthread
  1. コンパイルコマンドの直後に-lpthreadを配置する必要があります。このコマンドは、pthread.hライブラリを使用してプログラムを実行するようコンパイラーに指示します。
  2. gcc -lはライブラリファイルとリンクします.lib接頭辞なしのライブラリ名でリンク-lします。

プラットフォームで同じ機能を持つ標準フラグが存在する場合は、非標準フラグを使用することはお勧めできません。
デビッドシュワルツ


12

cmakeを使用している場合は、以下を使用できます。

add_compile_options(-pthread)

または

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")


6

私は、追加の適切な方法と考えているpthreadでは、CMake次のようにあります

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

Visual Studio 2019 -pthreadでは、プロジェクトのプロパティページで以下を指定します。

リンカ->コマンドライン->追加オプション

入力する -pthreadテキストボックスにます。


3

このオプション-lpthreadはgccで使用する必要があります。


7
間違った情報!-lpthread「オプション」ではなく、ライブラリを指定します。

コマンドラインオプション(コマンドライン引数とは対照的)
Alexander Stohr

3

必要なのは、proprieties => C / C ++ build => GCC C ++ Linker => Libraries => top part "Libraries(-l)"に「pthread」を追加することだけです。それでおしまい


2

manページを確認してください。

-pthreadを使用してコンパイルおよびリンクします。

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....

0

Anjutaで、[ビルド]メニューから[プロジェクトの構成]に移動します。[オプションの構成]ボックスに、以下を追加します。

LDFLAGS='-lpthread'

それが誰かにも役立つことを願っています...


0

複数のライブラリを使用している場合は、ライブラリの依存関係を確認してください。(例-lpthread -lSDL ... <==> ... -lSDL -lpthread)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.