web-dev-qa-db-ja.com

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

私は https://computing.llnl.gov/tutorials/pthreads/ からウェブから以下のデモを拾いました。

#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が含まれるため、これは私には意味がありません。何がうまくいかないのですか?

324
Ralph

この質問に対する両方の答えはこれまでのところ 不正確 です。
Linuxの場合、正しいコマンドは次のとおりです。

gcc -pthread -o term term.c

一般に、ライブラリはコマンドラインでソースとオブジェクトをたどるべきです、そして-lpthreadは「オプション」ではありません、それはライブラリ仕様です。 libpthread.aだけがインストールされているシステムでは、

gcc -lpthread ...

リンクに失敗します。

610

eclipseで

プロパティ - > c/c ++ビルド - >設定 - > GCC C++リンカ - >上部のライブラリに "pthread"を追加

34
sam

実際には、次のチュートリアルを読み続けると、pthreadsコードに使用されるコンパイルコマンドのいくつかの例が以下の表に一覧表示されます。

https://computing.llnl.gov/tutorials/pthreads/#Compiling

enter image description here

15
dylanninin

Linux端末から実行して、私のために働いたのは以下のコマンドを使用してコンパイルしていました(私がコンパイルしたいcファイルがtest.cと呼ばれると仮定します):

gcc -o test test.c -pthread

誰かに役立つことを願っています!

11

このようにコンパイルしてください。gcc demo.c -o demo -pthread

6
leesagacious

Gccと一緒にオプション-lpthreadを使う必要があります。

4
xiaolong

Cmakeを使用している場合は、次のものを使用できます。

add_compile_options(-pthread)

または

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

必要なのはproproieties => C/C++ build => GCC C++ Linker => Libraries =>上部のLibraries(-l)に "pthread"を追加するだけです。それでおしまい

3
sam

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

gcc -o term term.c -lpthread

コンパイルコマンドの直後に-lpthreadを指定する必要があります。このコマンドは、pthread.hでプログラムを実行するようにコンパイラに指示します。library.gcc -lライブラリファイルとリンクします。

2
gopika

Anjutaで、[ビルド]メニューの[プロジェクトの構成]をクリックします。 [オプションの設定]ボックスに次の行を追加します。

LDFLAGS='-lpthread'

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

0
naXa

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

0
user1793997

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
kalu Wang

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

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

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

0
WBuck

pthreadCMakeを追加する適切な方法は、次のとおりです。

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
0
Rufus