2017-03-04 314 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库链接 - 预定义的宏没有被定义。 –