我的一个项目遇到了麻烦。看来我链接到需要pthread符号的库,但该库本身未与pthread链接。症状是我尝试运行该程序时出现段错误。我跑了:

LD_DEBUG=all ./my_program

在寻找pthread_create时发现了段错误。如果我使用以下命令强制预加载pthread,则程序将运行:
LD_PRELOAD=/lib/x86_64-linux-gnu/libpthread.so.0 ./my_program

为了解决这个问题,我想我会使用-lpthread在构建脚本中将my_program与pthread链接起来。那没有用,所以我尝试了-pthread。也没用。我能够将其复制到最低限度:
echo "int main() { return 0; }" | g++ -x c++ - -pthread -lpthread -o my_program && ldd my_program
linux-vdso.so.1 =>  (0x00007ffe4fd08000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f150ca5c000)
/lib64/ld-linux-x86-64.so.2 (0x000055ac8c275000)

从ldd的输出中可以看到,my_program未与pthread链接。我怀疑发生这种情况是因为g++理解我实际上并没有使用pthread中的任何符号,也没有与之链接。因此,我尝试添加对pthread_create的调用:
echo -e "#include <pthread.h>\n int main() { pthread_create(0,0,0,0); return 0; }" | g++ -x c++ - -pthread -o my_program && ldd my_program
<stdin>: In function ‘int main()’:
<stdin>:2:37: warning: null argument where non-null required (argument 1) [-Wnonnull]
<stdin>:2:37: warning: null argument where non-null required (argument 3) [-Wnonnull]
linux-vdso.so.1 =>  (0x00007ffd977f9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fafe1bb6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fafe17f1000)
/lib64/ld-linux-x86-64.so.2 (0x0000563ee0002000)

请忽略警告,我知道对pthread_create的调用是虚假的。关键是现在它实际上与pthread链接。

所以我的问题是:是否有强制g++链接某些东西(在本例中为pthread)而没有使用符号添加伪代码的问题?

最佳答案



试试这个:

echo "int main() { return 0; }" |
g++ -x c++ - -o my_program -Wl,--no-as-needed -lpthread -Wl,--as-needed

关于c++ - 用G++强制链接到pthread,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37556673/

10-13 07:20