Makefile 将gfortran与库一起使用

Makefile 将gfortran与库一起使用,makefile,libraries,legacy-code,gfortran,Makefile,Libraries,Legacy Code,Gfortran,我有一个使用fortran 77编写的遗留代码。我正试着用gfortran建造它。但我似乎在构建中包含库的阶段失败了。几十个*.f源文件可以很好地编译,但是当它们被链接时,我会得到一堆“未定义的引用”错误,所有这些错误都与我的库中定义的子程序和函数有关。我已经首先运行了库的makefile,所以我需要的变量都应该被导出。我正在使用“-L”选项,但无法使其按预期工作 首先,以下是我的makefile中链接行的语法: 29 $(PROGRAM): $(SRCS) $(LIBS) 30

我有一个使用fortran 77编写的遗留代码。我正试着用gfortran建造它。但我似乎在构建中包含库的阶段失败了。几十个*.f源文件可以很好地编译,但是当它们被链接时,我会得到一堆“未定义的引用”错误,所有这些错误都与我的库中定义的子程序和函数有关。我已经首先运行了库的makefile,所以我需要的变量都应该被导出。我正在使用“-L”选项,但无法使其按预期工作

首先,以下是我的makefile中链接行的语法:

 29 $(PROGRAM): $(SRCS) $(LIBS)
 30         $(FC) $(FLFLAGS) -o $@ $+ -L$(DIRLIB) 
PROGRAM是程序名,src是所有编译的源文件,LIBS被设置为两个不同的文件-一个归档文件(file.a)和一个file.o文件。 FC是gfortran,到目前为止,我没有FLFLAGS的任何特定链接标志,而DIRLIB是库的主目录。 问题是,我的*.o文件是在构建我的库时生成的,它不仅仅位于主目录DIRLIB中。DIRLIB包含几个目录,所有目录都有自己的*.o文件,我的代码需要这些文件

我尝试在-L选项(例如DIRLIB/DIR1/*.o DIRLIB/DIR2/*.o DIRLIB/DIR3/*.o)之后添加每个单独的目录,但最终开始出现错误,一些子例程被多次定义。
所有这些用户定义库和归档文件的业务都让我感到困惑,而且我对制作makefiles一开始就相当陌生,因此,我只是在这里摸黑,也许有人能帮我弄清楚这一点。

库需要在链接命令中引用它们的
.o
文件之后出现。

我猜
LIBS
中的对象文件在库之后,但是需要它的一些过程。您能否显示实际运行的命令(所有变量都已展开),以确认这一点?

我尝试使用库再次构建此代码。这次成功了。我很确定我在makefile中做的事情和我以前做的一样,所以它一定与我拥有的库有关。也许有人在路上把它改了,不小心把它弄坏了。但我得到了图书馆的一份新的干净的副本。我的步骤是:

1) 运行库源文件的makefile;它创建了一个库。一个存档文件

2) 运行我的代码生成文件:

 29 $(PROGRAM): $(SRCS) $(LIBS)
 30         $(FC) $(FLFLAGS) -o $@ $+ -L$(DIRLIB) 
  • 它有一行指定此存档文件的位置并将其分配给“DIRLIB”

    DIRLIB:=../library

  • 然后,makefile的链接命令变为

    $(FC)$(FLFLAGS)-o$@$+-L$(DIRLIB)-lskit


FC是我的编译器,FLFLAGS是我的链接标志,-L是指定要包含的库的位置的选项,-lskit是一个关键选项,它似乎允许使用F77库。。。如果没有-lskit选项,我会得到许多未定义的引用错误。可能是上次我没有在结尾处包含此-lskit选项。

我不知道您的问题的答案,但您是否在任何*.o文件上尝试过readelf-a命令?readelf至少会告诉您链接器试图查找的符号(如果有的话)。这可能会为你提供下一步尝试的线索。祝你好运。很抱歉,我花了这么长时间才回到这件事上,但我的其他工作没有完成。我了解到,整个过程是编译库中的源文件,然后将.o文件包含在.a文件中,这是链接阶段应该包含的内容。不幸的是,我就是不能让它工作,所以我只是简单地把库源文件和主要程序源文件一起构建,并一次链接它们。。。不需要使用-L选项或处理静态库。