【发布时间】:2018-11-10 14:32:08
【问题描述】:
我想编译一个程序main,它使用两个不同的模块m1 和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/libf 被两者 m1 和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':
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