我編譯最新的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到可執行文件的信息。雖然奇怪,但它根本沒有抱怨。
有人能告訴我什麼是錯?謝謝。
==,好吧,我忘了提及我在gcc命令中使用了'-pthread'。感謝您的建議 –
這是-lpthread,而不是-pthread。 – BhanuSingh
也許你可以看看這個SO帖子:http://stackoverflow.com/questions/23250863/difference-between-pthread-and-lpthread-while-compiling使用-lpthread選項只會導致pthread庫鏈接 - 預定義的宏沒有被定義。 –