我想编译一个使用两个不同模块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
想法(到目前为止所有这些都失败了)
有一个最小的例子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命令的必要步骤是什么?
答案 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