![如何根据程序在运行时链接不同(不兼容)的库?](https://linux22.com/image/26767/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E7%A8%8B%E5%BA%8F%E5%9C%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E9%93%BE%E6%8E%A5%E4%B8%8D%E5%90%8C%EF%BC%88%E4%B8%8D%E5%85%BC%E5%AE%B9%EF%BC%89%E7%9A%84%E5%BA%93%EF%BC%9F.png)
我有许多遗留代码需要使用特定的(并且经常是冲突的)库进行编译。具体来说,我有一个只能用 编译的程序g77
,另一个只能用gfortran
.
我们来调用第一个程序马克伊和第二个程序UVES_popler。
编译(和运行)时,它们都需要链接到绘图这是用相应的编译器编译的。所以,编译马克伊与 g77 需要一起运行绘图g77
这也已被编译。且相同,分别为UVES_popler和gfortran
。
假设我可以使用 g77 和 gfortran 编译 pgplot ——组织 bashrc 的最佳实践是什么?我应该为每个程序创建一个 bash 函数并拥有正确的链接和LD_LIBRARY_PATH
s 吗?就像是:
runmakee() {
export LD_LIBRARY_PATH=/path/to/g77-pgplot/
makee
}
并且(可能相关)是否有一种方法可以在 Makefile 中设置标志,以便在分别编译这些程序时调用正确的库?
答案1
您的 bash 函数应该可以工作,但“通常”的方法是为每个可执行文件编写一个包装脚本,并在其中设置需要设置的任何内容。 (可以将可执行文件名称更改为foo.bin
例如,并调用包装脚本foo
以方便调用。)
对于 ELF 目标(不确定其他对象格式),您还可以设置-rpath
链接器选项以直接在可执行文件中硬编码运行时库搜索路径。使用 gcc(对于 C 代码),对于最后的链接阶段,它看起来像:
gcc ... -Wl,-rpath,/your/hardcoded/path ...
我假设 Fortran 编译器有类似的选项,或者您可以自己直接更改链接器选项(在这种情况下选项是-rpath /your/path
)。