0

関数内で pthread_mutex_lock を pthread_mutex_trylock に置き換えたいのですが、そうすると、「未定義の参照」エラー メッセージが表示されます (以下を参照)。行 411 から 13 を pthread_mutex_lock(&cmd_queue_lock) に置き換えると、リンカ エラーは発生しません。

それらは両方とも、私が既に含めている同じライブラリからのものです。1 つはリンカ エラーを生成し、もう 1 つは生成しないのはなぜですか? さらに重要なことに、どうすれば修正できますか?「extern int pthread_mutex_trylock」を追加して、Makefile の .o ファイルの順序を変更しようとしましたが、どちらも機能しません。

$ nl clientmain.c

    12  #include <stdio.h>
    ...
    21  #include <pthread.h>

    411 if (pthread_mutex_trylock(&cmd_queue_lock) == EBUSY) {
    412     continue;
    413 }

$ make
clientmain.o: In function `createHC':
clientmain.c:411: undefined reference to `pthread_mutex_trylock'
collect2: ld returned 1 exit status
make: *** [clientmain] Error 1
4

1 に答える 1

0

確かに、これを説明しているマニュアルページへの参照は見つかりませんが-lpthread、最終的なリンクフェーズに追加することでおそらくうまくいくでしょう. pthread_mutex_trylockすべての/usr/lib/lib*.aファイルでシンボルを探して見つけたのですが、シンボルを/usr/lib/libpthread.a定義していたのは 1 つだけでした。リバースエンジニアリング。

のマニュアルページには、オプションをgcc使用してPOSIXスレッドサポートを含めることができる/すべきであると書かれているため、おそらくそれが王道です。このオプションは私のシステムでも機能しました。興味深いことに、レギュラーは提供していますが、提供していないため、混乱が生じました。のマニュアル ページには、このオプションが前処理に影響を与えるとも書かれていることに注意してください。-pthreadgcc/usr/lib/libc.apthread_mutex_lockpthread_mutex_trylockgcc/usr/lib/libpthread.a

于 2013-04-02T23:28:49.590 に答える