gcc / ld结合了使用相同链接子库的不同版本的库

时间:2018-05-31 14:26:01

标签: gcc linker static-libraries ld symbols

我想编译一个使用两个不同模块mainm1的程序m2,每个模块使用不同版本的库./f1/libfa和`./ F2 / libf.a。我无法更改libf库中的源代码,我只能访问main,m1和m2源代码。

gfortran -o main main.F90 -L./f1 -lf m1.o -L./f2 -lf m2.o && ./main

链接器默认设置会导致 ./f1/libfm1使用m2。如何m1使用./f1中的库和m2使用./f2

中的库

想法(到目前为止所有这些都失败了)

  • 操纵链接库路径(但我只能添加到路径中,不能从路径中删除-L
  • 使用--exclude-libs,隐藏符号......
  • 在链接阶段重命名符号

有一个最小的例子https://github.com/platipodium/multisymbol。任何帮助非常感谢。

我尝试了objcopy

objcopy --redefine-sym __f_MOD_g=_f1_f_MOD_g f1/libf.a objcopy --redefine-sym __f_MOD_g=_f1_f_MOD_g f1/f.o objcopy --redefine-sym __f_MOD_g=_f1_f_MOD_g m1.o

现在符号看起来正确且不同,但我得到了

gfortran -o main main.F90 -Lf1 -lf m1.o -Lf2 -lf m2.o && ./main m2.o: In function __ m2_MOD_b&#39 ;: m2.F90 :(。text + 0x5):对__f_MOD_g'

的未定义引用

直接使用目标文件现在可以使用。

gfortran -o main main.F90 f1/f.o m1.o f2/f.o m2.o && ./main I am first I am second

那么从上面的工作命令到obj文件到archive / library命令的必要步骤是什么?

1 个答案:

答案 0 :(得分:1)

  

链接器默认设置导致m1和m2都使用./f1/libf。

这是预期的:那只是how UNIX linkers work

  

如何让m1使用./f1中的库,m2使用./f2中的库

您必须重命名任何有冲突的符号(objcopy可以执行此操作)。

<强>更新

  

我试过objcopy ...
  gfortran -o main main.F90 -Lf1 -lf m1.o -Lf2 -lf m2.o

这个命令行是错误的,原因在上面的“UNIX链接器如何工作”中有解释。

你想:

gfortran -o main main.F90 m1.o m2.o -Lf1 -lf -Lf2 -lf

实际上,这也不太可能有效:您还想重命名f2/libf.a - &gt; f2/libf2.a然后:

gfortran -o main main.F90 m1.o m2.o -Lf1 -lf -Lf2 -lf2
相关问题