我试图在终端的远程机器上运行可执行文件 - SaTScanBatch,SaTScan软件的可执行文件 .
这是我得到的错误
/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.15' not found
问题类似于:/usr/lib/libstdc++.so.6: version GLIBCXX_3.4.15' not found](https://stackoverflow.com/questions/5216399/usr-lib-libstdc-so-6-version-glibcxx-3-4-15-not-found)或[How to fix: /usr/lib/libstdc++.so.6: version
GLIBCXX_3.4.15' not found或/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found
在我的情况下有什么不同,我没有管理员权限,所以我不能在usr / lib文件中添加库 . 我在远程存储库中下载了libstdc .6.0.15,我想用它来执行我的文件 .
这是我尝试过的可能性
i)将环境变量LD_LIBRARY_PATH或LD_RUN_PATH或LD_PRELOAD修改为libstdc .so.6.0.15的路径 . - >没有改变任何东西
ii)以静态方式包含库
gcc SaTScanBatch -static-libstdc++
-
-static选项无法识别,我猜远程机器的GCC版本太旧了 .
iii)尝试将文件链接到附加库:
gcc SaTScanBatch -L /path/library -l stdc++
或类似的
gcc SaTScanBatch -Wl,-rpath,path/to/library
-
错误
/usr/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored.
/usr/bin/ld: error in SaTScanBatch64(.eh_frame); no .eh_frame_hdr table will be created.
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o: In function _start:
(.text+0x20): undefined reference to "main"
collect2: ld returned 1 exit status
iv)使用PatchElf链接文件和库 - >我无法安装PatchElf,因为没有管理员权限
谢谢你的任何建议!
1 回答
你究竟尝试了什么?
LD_LIBRARY_PATH
应设置为包含新libstdc++.so.6
的目录而不是文件本身,并且您需要export
环境变量,以便它可用于子进程,而不仅仅是shell . 你需要一个从libstdc++.so.6
到libstdc++.so.6.0.15
的符号链接,因为动态加载器将查找该名称,而不是libstdc++.so.6.0.15
在链接期间使用
LD_RUN_PATH
将路径烘焙到可执行文件中 . 尝试运行可执行文件时,它在运行时不执行任何操作 . 如果使用它,则需要将其设置为远程计算机上包含libstdc++.so.6
文件的目录 . 同样,它需要设置为目录,而不是文件的路径 .LD_PRELOAD
再次变得不同,几乎肯定不是你想要的 . 您可以使用它来强制在可执行文件运行时加载特定的共享库 . 这可用于预加载较新的libstdc,但通常最好使用LD_LIBRARY_PATH
在运行时设置路径,或者LD_RUN_PATH
在链接时设置路径 .你展示的命令是无稽之谈,他们不会试图从无到有创建一个可执行文件 . 这就是为什么你得到错误
undefined reference to "main"
对于您的场景,我建议使用
LD_LIBRARY_PATH
.