约束:
>我不允许强迫他们升级到新的标准库.
>我不想让动态库保持静态. (我可以将所有内容静态编译到主应用程序中一次,但是有一些后勤障碍阻止我将某些库重新编译为静态库).
-Wl,-rpath = $(path_to_directory)有点危险,但它是合法的,因为客户确实提供了一些允许我设置路径变量的设置.但是,设置我的新stdlibc的rpath似乎并没有覆盖默认的/usr/lib64版本.我仍然得到GLIBCXX错误,因为它不会使用正确的库.
也许我的程序中只有一个错误.这是一个例子(对于审查员很抱歉,但它只是用户名的东西):
~/example$pwd /home/username/example ~/example$echo $LD_LIBRARY_PATH ~/example$ls Makefile libstdc++.so.6.0.18 test.cpp ~/example$make g++ -std=c++11 -Wall -Werror test.cpp -o test ~/example$ldd test ./test: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./test) linux-vdso.so.1 => (0x00007fffe5919000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000390b800000) libm.so.6 => /lib64/libm.so.6 (0x0000003904800000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000390b400000) libc.so.6 => /lib64/libc.so.6 (0x0000003904400000) /lib64/ld-linux-x86-64.so.2 (0x0000003904000000) ~/example$setenv LD_LIBRARY_PATH /home/username/example ~/example$echo $LD_LIBRARY_PATH /home/username/example ~/example$ldd test ./test: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./test) linux-vdso.so.1 => (0x00007fff2d3ff000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000390b800000) libm.so.6 => /lib64/libm.so.6 (0x0000003904800000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000390b400000) libc.so.6 => /lib64/libc.so.6 (0x0000003904400000) /lib64/ld-linux-x86-64.so.2 (0x0000003904000000)
~/example$file libstdc++.so.6.0.18 libstdc++.so.6.0.18: ELF 32-bit LSB shared object,Intel 80386,version 1 (SYSV),dynamically linked,not stripped
有些dweeb构建了错误的库版本,另一个dweeb(即我自己)尝试在64位机器上使用它.使用LD_LIBRARY_PATH一直在工作……
解决方法
而不是使用LD_LIBRARY_PATH(在您无法控制的机器上很脆弱,因为用户可能会改变他们的环境)我更喜欢使用’-Wl,-rpath,$ORIGIN’进行链接(注意,必须使用引号来阻止shell扩展$ORIGIN )
$ORIGIN的RPATH告诉动态链接器开始在与可执行文件相同的目录中查找共享库,因此如果您将libstdc .so与可执行文件一起发送,它将被找到.如果要将可执行文件发送到bin目录并将库放在lib目录中,可以使用’-Wl,$ORIGIN /../ lib’或相对于可执行文件位置的其他路径.
原文地址:https://www.jb51.cc/c/119233.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。