2017-03-04 5 views
1

最新のビルドルートをコンパイルし、出力ホスト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-gcclibpthread.soを見つけることができないということです。不思議にも、それは全く文句を言っていませんでした。

何が問題なのですか?ありがとうございました。例えば、コンパイルコマンドで

-lpthreadを追加

答えて

0

てみてください。:

gcc <source file>.c -o <object file name> -lpthread 

gccはコンパイラのコマンドです。

-lpthreadは、pthread.hライブラリファイルを実行するオプションです。

+0

==まあ、私はgccコマンドで '-pthread'を使ったことを忘れています。 –

+0

あなたのアドバイスありがとうございます。それは-pthreadで、-pthreadではありません。 – BhanuSingh

+0

多分あなたはこのSOの投稿を見ることができます:http://stackoverflow.com/questions/23250863/difference-between-pthread-and-lpthread-while-compiling -lpthreadオプションを使用すると、pthreadライブラリのみがリンクされます - あらかじめ定義されたマクロは定義されません。 –

関連する問題