我编译最新的 buildroot,并使用输出主机 mipsel-linux-gcc
来编译我的 c 程序。我已经测试了 hello world 程序,它在 MIPS 机器上运行良好(实际上是一个用 padavan 刷新的路由器)。然后我编译了我的程序,它运行良好,它调用了 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
选项(从其他 SO 帖子中学习)并找到:
attempt to open buildroot/output/host/usr/mipsel-buildroot-linux-uclibc/sysroot/usr/
lib/libpthread.a succeeded
链接时,链接器只找到libpthread.a
,所有libpthread.so
搜索失败。看到这一点,我使用 find 进行了检查。 -在 buildroot 目录中命名为“*pthread.so”
,但什么也找不到。
如果链接器只找到 pthread 静态库那么它为什么不提示?我浏览了 make menuconfig
,没有看到任何关于 pthread 库的选项。
readelf 的输出是:
readelf -d ./myprogram |grep NEEDED
0x00000001 (NEEDED) Shared library: [libc.so.0]
我们可以看到该程序不包含对libpthread
的需求!与native(x64) 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 的信息添加到可执行文件中。奇怪的是它根本没有提示。
谁能告诉我这是怎么回事?谢谢。
最佳答案
尝试在编译命令中加入-lpthread
例如:
gcc <source file>.c -o <object file name> -lpthread
gcc 是编译命令。
-lpthread
是执行pthread.h
库文件的选项。
关于交叉编译可执行文件无法解析符号 pthread_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42591209/