如何根据程序在运行时链接不同(不兼容)的库?

如何根据程序在运行时链接不同(不兼容)的库?

我有许多遗留代码需要使用特定的(并且经常是冲突的)库进行编译。具体来说,我有一个只能用 编译的程序g77,另一个只能用gfortran.

我们来调用第一个程序马克伊和第二个程序UVES_popler

编译(和运行)时,它们都需要链接到绘图这是用相应的编译器编译的。所以,编译马克伊与 g77 需要一起运行绘图g77这也已被编译。且相同,分别为UVES_poplergfortran

假设我可以使用 g77 和 gfortran 编译 pgplot ——组织 bashrc 的最佳实践是什么?我应该为每个程序创建一个 bash 函数并拥有正确的链接和LD_LIBRARY_PATHs 吗?就像是:

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)。

相关内容