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