我有"图书馆"具有多个对象(.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来处理这种情况
答案 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
这就是你应该如何使用一组目标文件资源 与不同的程序联系将需要不同的子集:你放 他们在图书馆并链接图书馆。