web-dev-qa-db-ja.com

正しいヘッダーファイルをインクルードしても「未定義の参照」エラーが発生するのはなぜですか?

このプログラムをコンパイルしようとすると失敗しました:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

void *WriteNumbers(void *threadArg)
{
    int start, stop;

    start = atoi((char *)threadArg);
    stop = start + 10;

    while (start < stop)
    {
         printf("%d\n", start++);
         sleep(1);
    }
    return 0;
}

int main(int argc, char **argv)
{
        pthread_t thread1, thread2;

        // create the threads and start the printing
        pthread_create(&thread1, NULL, WriteNumbers, (void *)argv[1] );
        pthread_create(&thread2, NULL, WriteNumbers, (void *)argv[2]);

        pthread_join(thread1, NULL);
        pthread_join(thread2, NULL);

        return 0;
}

それは私に次のエラーを与えました:

tmp/ccrW21s7.o: In function `main':
pthread.c:(.text+0x83): undefined reference to `pthread_create'
pthread.c:(.text+0xaa): undefined reference to `pthread_create'
pthread.c:(.text+0xbd): undefined reference to `pthread_join'
pthread.c:(.text+0xd0): undefined reference to `pthread_join'
collect2: ld returned 1 exit status

これらの関数を宣言するpthread.hを含めたのに、なぜこれらの未定義の参照エラーが発生するのですか?

16
Cold-Blooded

Pthreadsライブラリとのリンクを忘れた可能性があります(コマンドラインで-lpthreadを使用)。

25
James McNellis

-lpthreadフラグを使用してpthreadライブラリにリンクしていないと言う人もいます。最新のGCC(どれだけ最新かはわかりませんが、私のものは4.3.3です)では、-pthreadだけを使用できます。マニュアルページから:

-pthread
pthreadsライブラリを使用したマルチスレッドのサポートを追加します。このオプションは、プリプロセッサとリンカの両方にフラグを設定します。

21
dreamlax

次のように、pthreadライブラリをバイナリにリンクする必要があります。

cc -o myapp myapp.c -lpthread
3
qrdl

行う

gcc -pthread -o name filename.c (cpp)

プログラムをコンパイルしてから

./name

プログラムを実行します。

2
mohamedkaidi

Csappソリューションを探している人々のために。最初に「csapp.c」をコンパイルしてから、

gcc -o filename filename.c csapp.o -lpthread
0
Shashanoid