【问题标题】:gcc/ld combine libraries which use different versions of the same linked sub-librarygcc/ld 组合使用相同链接子库的不同版本的库
【发布时间】:2018-11-10 14:32:08
【问题描述】:

我想编译一个程序main,它使用两个不同的模块m1m2,每个模块都使用不同版本的库./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/libf两者 m1m2 使用。如何让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': 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 文件的工作命令到归档/库命令的必要步骤是什么?

【问题讨论】:

    标签: gcc linker static-libraries ld symbols


    【解决方案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 -> f2/libf2.a 然后:

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

    【讨论】:

    • 是的,这是预期的行为。我试过objcopy,但没能成功使用。在这两个库中,冲突符号是0000000000000000 T __f_MOD_g。您能否在最小示例中添加所需的步骤?
    • 谢谢。我不得不重命名mv f1/libf.a f1/libf1.a 并使用您更新的命令,它可以工作。现在将这个例子应用到一个实际问题上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2017-10-19
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多