2017-03-04 150 views
1

我編譯最新的buildroot,並使用輸出主機mipsel-linux-gcc來編譯我的c程序。我測試了hello world程序,並且它在MIPS機器上運行正常(實際上是一個用padavan閃爍的路由器)。然後我編譯了我的程序,它運行良好,它調用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文件確實存在。

然後我懷疑這可能是由交叉編譯設置引起的。所以我加入-L. -Wl,--verbose選項(從其他SO後得知)檢查鏈接庫,發現:

attempt to open buildroot/output/host/usr/mipsel-buildroot-linux-uclibc/sysroot/usr/ 
lib/libpthread.a succeeded 
鏈接時

,連接器只能找到libpthread.a,所有libpthread.so搜索失敗。看到這個,我在buildroot目錄中使用find . -name "*pthread.so"進行了檢查,沒有發現任何東西。

如果鏈接器只發現pthread靜態庫,那麼它爲什麼不投訴?我瀏覽了make menuconfig,並沒有看到有關pthread庫的任何選項。

的readelf輸出是:

readelf -d ./myprogram |grep NEEDED 
0x00000001 (NEEDED)      Shared library: [libc.so.0] 

我們可以看到,該計劃不包括libpthread的需要!與本地(64)編制的同一個程序相比GCC:

readelf -d ./myprogram |grep NEEDED 
0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 

我最好的猜測現在是mipsel-linux-gcc找不到libpthread.so,因此沒有添加有關的libpthread到可執行文件的信息。雖然奇怪,但它根本沒有抱怨。

有人能告訴我什麼是錯?謝謝。

回答

0

嘗試編譯命令

例如爲:

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

GCC是編譯器命令添加-lpthread

-lpthread是執行pthread.h庫文件的選項。

+0

==,好吧,我忘了提及我在gcc命令中使用了'-pthread'。感謝您的建議 –

+0

這是-lpthread,而不是-pthread。 – BhanuSingh

+0

也許你可以看看這個SO帖子:http://stackoverflow.com/questions/23250863/difference-between-pthread-and-lpthread-while-compiling使用-lpthread選項只會導致pthread庫鏈接 - 預定義的宏沒有被定義。 –

相關問題