在gfortran中链接多个目标文件



我有一个包含多个对象(.o)文件的"library"文件夹。这些文件包含子例程,这些子例程不会因项目而更改。每个新项目都使用其中一些目标文件,但不是全部。
你能告诉我有没有办法让gfortran在那个文件夹中查找必要的。o文件?
我试过-I和-L选项,但不行。当我直接写。o名称时,它可以工作:
gfortran main.for ./library/obj1.o ./library/obj2.o
但是我有许多。o文件,并且写它们都浪费时间。我可以写
gfortran main.for ./*.o
,但是主程序将与所有。o文件链接,但它只需要其中的一些。我希望像
gfortran main.for -L./library/
这样的东西会工作,但它没有。
我使用OS X与gcc版本5.1.0。我很确定这种情况下应该使用makefile

您混淆了对象文件和静态库。目标文件不是静态库和gfortran的链接器——这是简单的吗由gfortran调用的GNU系统链接器不会这样对待它。您需要一个静态库,并且正在尝试使用目标文件代替。

链接器通过扩展名.o来识别目标文件。它认可一个扩展名为.a的静态库,它需要.a文件的内容具有静态库的形式,而不是目标文件的格式。(所以你不能仅仅通过重命名一个对象文件就把它变成一个静态库)。

链接器将把出现在其目录上的每个目标文件链接到你的程序中命令行,无论是否需要。它不指望你提及对象文件,如果不希望它们被链接。链接器选项-L-l定位对对象文件没有任何应用。

静态库是一个相当简单的归档文件,包含一定数量的对象文件,加上一个管理头文件,通常还有对象的索引包含在目标文件中的公共符号。

当链接器在其命令行上遇到静态库时,它不会这样做链接整个库的内容(除非您明确告诉它)。它检查所包含的目标文件,以确定其中包含哪些(如果有的话)在链接的那一点上尚未定义的符号的定义程序的。如果找到库中的任何目标文件提供任何缺失的定义,然后从库中提取该对象文件并连接到程序中。库中提供no . 0的对象文件未链接的定义。命令行上的库是顺序的以这种方式检查,直到程序引用的所有符号在链接的目标文件中有定义,或者没有更多的库。

如果像你说的那样,你试图使用作为库的目标文件是稳定的你永远不需要为你的项目构建资源,那么你就可以创建一个静态的库,并将该库与每个项目的程序链接。

从对象文件创建静态库,使用ar工具。参见man ar .

当你创建了你的库,比如libsubs.a,并决定它应该存在在某个目录/path/to/subs中,然后通过添加

将其与程序链接
    -L/path/to/subs -lsubs

链接到程序所在的命令行。这将导致链接器命令:在目录/path/to/subs中搜索名为libsubs.a的库。

所以,如果你是编译和链接在一个步骤,使用它像:

gfortran -o myprog myprog.f90 -L/path/to/subs -lsubs

如果你在不同的步骤中编译和链接,像这样使用:

gfortran -c -o myprog_1st_file.o myprog_1st_file.f90
gfortran -c -o myprog_2nd_file.o myprog_2nd_file.f90
gfortran -o myprog myprog_1st_file.o myprog_2nd_file.o -L/path/to/subs -lsubs

这是你应该如何使用一组目标文件资源不同的子集将需要与不同的程序链接

最新更新