Compilation 在gfortran中链接多个对象文件

Compilation 在gfortran中链接多个对象文件,compilation,makefile,linker,fortran,gfortran,Compilation,Makefile,Linker,Fortran,Gfortran,我有一个包含多个对象(.o)文件的“库”文件夹。这些文件包含子例程,这些子例程不会在项目之间更改。每个新项目都会使用其中一些对象文件,但不是全部。 您能告诉我有没有办法让gfortran在该文件夹中查找必要的.o文件? 我试过-I和-L选项,但没有办法。当我直接写.o名称时,它是有效的:gfortran main.for./library/obj1.o./library/obj2.o但是我有很多.o文件,写它们都浪费时间。 我可以编写gfortran main.for./*.o,但主程序将与所有

我有一个包含多个对象(.o)文件的“库”文件夹。这些文件包含子例程,这些子例程不会在项目之间更改。每个新项目都会使用其中一些对象文件,但不是全部。
您能告诉我有没有办法让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/

这样的东西能起作用,但它不行。
我在gcc版本5.1.0中使用OSX。
我很确定我应该在这种情况下使用makefile

你把对象文件和静态库混淆了。对象文件 不是一个静态库和gfortran链接器-这只是 由
gfortran
调用的GNU系统链接器将不这样处理它。 您需要一个静态库,并尝试使用对象文件代替

链接器通过扩展名
.o
识别对象文件。它承认 扩展名为
.a
的静态库,它需要
.a
文件的内容 具有静态库的形式,而不是对象文件的格式。(那么你呢 无法仅通过重命名将对象文件转换为静态库)

链接器会将其上出现的每个对象文件链接到您的程序中 命令行,无论是否需要。它不希望你提及 对象文件(如果不希望链接)。的链接器选项
-L
-L
定位库不适用于对象文件

静态库是一个相当简单的存档,包含一些 对象文件,加上一个house-keeping头,通常是 包含的对象文件中定义的公共符号

当链接器在其命令行上遇到静态库时,它不会 链接库的全部内容(除非您明确告知)。它检查 包含的对象文件,以确定其中哪些文件(如果有)包含 在链接中该点尚未定义的符号的定义 是节目的一部分。如果发现库中的任何对象文件提供 如果缺少定义,则从库中提取该对象文件 并链接到程序中。库中不提供 未链接缺少的定义。命令行上的库是按顺序排列的 以这种方式进行检查,直到程序引用的所有符号 在链接的对象文件中有定义,或者没有其他库

如果正如您所说,您尝试用作库的对象文件是稳定的 您永远不必为项目构建的资源,那么您只需创建一个静态 并将该库与每个项目的程序链接

要从对象文件创建静态库,请使用该工具。 请参见
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
如果您在不同的步骤中编译和链接,请使用以下方法:

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
这就是您应该如何使用一组对象文件资源的方法 与不同程序的链接将需要不同的子集:您将
将它们放在库中并链接库。

太棒了!你描述的正是我需要的。不知道为什么我错过了将所有对象文件组织到静态库中的想法。谢谢!还有一件事)如果我需要在静态库中的一个子例程中进行临时更改怎么办?例如,我在
CALC.o
中有一个名为CALC的子程序。我将
calc.o
和许多其他
.o
文件打包到静态库中。但是在开发过程中,我需要向
calc.o
添加一些临时更改。如果我把
MainProgram.for
calc.for
放在一起,并用lib编译和链接它们,链接器会说,我已经复制了calc的引用。是否可以告诉链接器,如果它已经在对象文件中找到子例程,那么它不应该从库中链接它?您只需要将专门版本的
calc.o
放在链接中比静态库更早的位置。正如我所解释的,链接器将从静态库中提取并链接一个对象文件,前提是该对象文件提供了链接中某些符号的定义,而这些符号在链接的那个点上仍然没有定义。如果您的
calc.o
定义了与库版本相同的所有符号,则如果首先链接了您的
calc.o
,库版本将被忽略。