Link gfortran 中的多个目标文件

Link multiple object files in gfortran

我有 "library" 个包含多个对象 (.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 版中使用 OS X。 而且我很确定我应该在这种情况下使用 makefile

您将目标文件与静态库混淆了。目标文件 不是静态库和 gfortran linker - 这很简单 GNU 系统 linker,由 gfortran 调用 - 不会这样对待它。 您需要一个静态库,并且您正在尝试使用目标文件代替。

linker 通过扩展名 .o 识别目标文件。它识别 扩展名为 .a 的静态库,它需要 .a 文件的 内容 具有静态库的形式,而不是目标文件的格式。 (那么你 无法通过重命名将目标文件变成静态库。

linker 将 link 到您的程序中出现在其上的每个目标文件 命令行,无论是否需要。它不希望你提及 目标文件,如果你不想 linked。 linker 选项 -L-l 定位 不适用于目标文件。

静态库是一个相当简单的存档,包含一些 目标文件,加上一个管理头文件和通常的索引 public 个符号在包含的目标文件中定义。

当 linker 在其命令行上遇到静态库时,它不会 link 图书馆的全部内容(除非你明确告诉它)。它检查 包含的目标文件以确定其中包含哪些(如果有的话) 在 link 时代尚未定义的符号定义 的程序。如果发现库中的任何目标文件提供任何 缺少的定义,然后从库中提取该目标文件 并 link 进入程序。 库中不提供的对象文件 缺少的定义不是 linked。命令行上的库是顺序的 以这种方式检查,直到程序引用的所有符号 在 linked 目标文件中有定义或没有更多的库。

如果如您所说,您尝试用作库的目标文件是稳定的 你永远不必为你的项目构建的资源,那么你可以只做一个静态的 它们中的库和 link 该库以及您的每个项目程序。

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

当你制作了你的图书馆,比如说,libsubs.a,并决定它应该驻留 在某个目录中,/path/to/subs,然后你 link 通过添加

程序
    -L/path/to/subs -lsubs

到您的程序所在的命令行 linked。这将导致 linker 在目录 /path/to/subs.

中搜索名为 libsubs.a 的库

因此,如果您在一步中进行编译和 linking,请像这样使用它:

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

如果您在不同的步骤中编译和 linking,请像这样使用它:

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

这就是你应该如何使用一组目标文件资源,其中 linkage 不同的程序需要不同的子集:你把 他们在图书馆和 link 图书馆。