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 图书馆。
我有 "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 图书馆。