链接gfortran中的多个目标文件

时间:2015-07-27 09:57:04

标签: 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 main.for -L./library/
这样的东西能够起作用,但它并没有 我使用OS X和gcc版本5.1.0。 而且我很确定我应该使用makefile来处理这种情况

1 个答案:

答案 0 :(得分:3)

您将目标文件与静态库混淆。目标文件 不是静态库和gfortran链接器 - 这很简单 由gfortran调用的GNU系统链接器 - 不会这样处理它。 您需要一个静态库,并且您尝试使用对象文件代替。

链接器通过扩展名.o识别目标文件。它承认 扩展名为.a的静态库,它需要.a文件的内容 具有静态库的形式,而不是目标文件的格式。 (那么你 只能通过重命名将对象文件放入静态库中。)

链接器将链接到程序中出现的每个目标文件 命令行,无论是否需要。它不指望你提到 目标文件,如果您不希望它们链接。链接器选项-L-l用于 找到没有应用于目标文件。

静态库是一个包含一些数量的相当简单的存档 目标文件,加上一个管家标题,通常是一个索引 在包含的目标文件中定义的公共符号。

当链接器在其命令行上遇到静态库时,它不会 链接库的全部内容(除非您明确告诉它)。它检查 包含的目标文件,以确定它们包含哪些内容(如果有) 在链接中该点尚未定义的符号的定义 该计划。如果发现库中的任何目标文件提供任何目标文件 缺少定义,然后从库中提取该目标文件 并链接到该计划。 库中提供no的对象文件 缺少的定义未链接。命令行上的库是顺序的 以这种方式检查,直到程序提到的所有符号 在链接的目标文件中有定义,或者没有更多的库。

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

要从目标文件创建静态库,请使用ar工具。 请参阅man ar

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

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

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

因此,如果您只需一步编译和链接,请使用它:

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

这就是你应该如何使用一组目标文件资源 与不同的程序联系将需要不同的子集:你放 他们在图书馆并链接图书馆。