2

Linux には、pthreads を使用する共有ライブラリと、それを使用しない main.c があります。

libpthread.so は共有ライブラリの ldd に表示されますが、これは正しいです。

$ ldd libmapreduce.so.1.0 
    linux-gate.so.1 =>  (0x0067d000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x0058c000)
    [...]

しかし、pthreads を使用しない main.c をコンパイルして、使用する共有ライブラリにリンクすると、次のように表示されます。

$ icc -Wall -o main main.c -lmapreduce
    /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `pthread_atfork'

-lpthread をコンパイル コマンドに追加します。つまり、

$ icc -Wall -o main main.c -lmapreduce -lpthread

未定義の参照を解決します。

main.c で libpthread が使用されておらず、共有ライブラリにすでに libpthread がリンクされている場合、明示的に libpthread にリンクする必要があるのはなぜですか?

4

2 に答える 2

6

実行可能ファイルまたは DLL を作成するには、プログラム内のすべての依存関係の推移的なクロージャーにリンクする必要があります。main.c は sharedlib にリンクしているため、pthreads を含む sharedlib のすべての依存関係にもリンクする必要があります。

于 2012-03-13T18:19:30.210 に答える
0

R.. と Pavan Manjunath に感謝します。

共有ライブラリ libmapreduce.so のリンク手順は次のようになります。

icc -shared -g -o libmapreduce.so.1.0 map.o map_wrp.o -openmp [...] -lpthread -ldl

この -openmp リンク フラグは不要であり、実際には pthread_atfork への未定義の参照が導入されました。pthread_atfork への未定義の参照は、main.c を共有ライブラリ libmapreduce.so にリンクしようとするまで表示されませんでした。-openmp フラグを指定せずに libmapreduce.so を再作成すると、問題が解決しました。

于 2012-03-14T19:55:06.347 に答える