6

Fedora 17 (GCC を使用) で Eclipse を使用しており、pthread.h が含まれていて、gcc ビルド コマンド ラインに -lpthread がある場合でも、pthread_create () に未定義の参照があります...

念のため、これが私のコードです

void* repair()
{
    int var;
    for ( var = 0; var < NB_ITER ; var += 2 )
    {
        printf( "PAIR : %d\n", var );
    }

return NULL;
} // pair

void exo03()
{
    pthread_t id1;
    pthread_create(&id1, NULL, &repair, NULL);
}

助けてくれてありがとう:)

4

2 に答える 2

8

Linux、FreeBSD (およびその他の *nix フレーバー) では、コンパイラ オプションを使用-pthreadし、pthread ライブラリとのリンクを試みる必要はありません。

日食の場合:

Eclipse は、gcc コンパイルに -pthread 引数を入れるように構成されていません。これを解決するには、メニューに移動します。

プロジェクト -> プロパティ

c/c++ ビルド -> GCC C コンパイラ -> その他

「-pthread」引数を「その他のフラグ」の先頭に追加します</p>

また、次の場所に移動します。

c/c++ ビルド -> 設定 -> GCC C リンカー -> ライブラリ

そして、「pthread」ライブラリを他のライブラリに含めます。[適用] をクリックして、プロジェクトを再構築します。Pthreads は今すぐ動作する必要があります。

man gccから:

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

ここで説明を見つけました:

GCC では、-pthread (別名 -pthreads) オプションは、コンパイラ プリプロセッサとリンカの両方を管理して、Posix スレッドでのコンパイルを有効にします。プリプロセッサは、一部のマクロの Posix スレッド バージョンを定義/有効化/使用します (または条件付きコンパイルを実行して Posix スレッド ロジックを有効にします)。リンカーは、結果のオブジェクトを libpthread に対して明確にリンクします。

ただし、-lpthreadは、libpthread ライブラリに対するすべての外部参照を解決しようとするようにリンカに指示するだけです。これは、-lm が libm ライブラリに対するすべての外部参照を解決しようとするようにリンカに指示するのと同じです。-lpthread の場合、重要なマクロがオンになっていないため、Posix スレッド コードを記述したとしても、コードに libpthread への外部参照が含まれていない可能性があります。

于 2013-02-27T15:03:31.043 に答える
6

libpthread にリンクしましたか?

$> gcc ... -lpthread
于 2013-02-27T15:04:20.760 に答える