最新のビルドルートをコンパイルし、出力ホストmipsel-linux-gcc
を使用してCプログラムをコンパイルします。私はhello worldプログラムをテストして、MIPSマシン(実際にはパドバンでフラッシュされたルータ)で正常に動作します。それから私は自分のプログラムをコンパイルして、pthread_create
というシンボルを解決できないことを示すpthread_create
を呼び出す良いユーティリティを実行します。クロスコンパイル実行ファイルがシンボルを解決できませんpthread_create
私は、ルータがlibpthread.so持っていないので、私がチェックするので多分それだと思った:
[RT-AC54U /home/root]# find/-name "*pthread*"
/lib/libpthread-0.9.33.2.so
/lib/libpthread.so.0
ファイルが存在しないので、それはlibpthreadのが判明。
次に、クロスコンパイルの設定が原因である可能性があります。だから私は(他のSOポストから学んだ)-L. -Wl,--verbose
オプションを追加することによって、リンクライブラリをチェックして見つける:
attempt to open buildroot/output/host/usr/mipsel-buildroot-linux-uclibc/sysroot/usr/
lib/libpthread.a succeeded
をリンクする際、リンカは唯一、すべてのlibpthread.so
検索が失敗し、libpthread.a
を見つけました。これを見て、buildrootディレクトリのfind . -name "*pthread.so"
を使って何も見つけられなかったことを確認しました。
リンカがpthread静的ライブラリのみを見つけた場合、なぜそれが不平を言わないのですか?私はmake menuconfig
でスキミングし、pthreadライブラリに関するオプションは見ていません。
readelfが出力されます:
readelf -d ./myprogram |grep NEEDED
0x00000001 (NEEDED) Shared library: [libc.so.0]
私たちは、プログラムがlibpthread
の必要性が含まれていないことを見ることができました!ネイティブ(x64)のことでコンパイルした同じプログラムと比較すると、GCC:
readelf -d ./myprogram |grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
私の最高の推測では、今ので、実行可能ファイルにlibpthreadの情報を追加していない、mipsel-linux-gcc
はlibpthread.so
を見つけることができないということです。不思議にも、それは全く文句を言っていませんでした。
何が問題なのですか?ありがとうございました。例えば、コンパイルコマンドで
を-lpthread
を追加
==まあ、私はgccコマンドで '-pthread'を使ったことを忘れています。 –
あなたのアドバイスありがとうございます。それは-pthreadで、-pthreadではありません。 – BhanuSingh
多分あなたはこのSOの投稿を見ることができます:http://stackoverflow.com/questions/23250863/difference-between-pthread-and-lpthread-while-compiling -lpthreadオプションを使用すると、pthreadライブラリのみがリンクされます - あらかじめ定義されたマクロは定義されません。 –