我有一个用fortran 77编写的遗留代码。我正在尝试用gfortran构建它。但我似乎在将库包含在构建中的阶段失败了。几十个*.f源文件编译得很好,但是当它们被链接时,我得到一堆“未定义的引用”错误,所有这些错误都与我的库中定义的子例程和函数有关。我已经首先运行了库的makefile,所以我需要的变量都应该被导出。我正在使用"-L“选项,但无法让它按预期工作。
首先,下面是我的makefile中链接行的语法:
29 $(PROGRAM): $(SRCS) $(LIBS)
30 $(FC) $(FLFLAGS) -o $@ $+ -L$(DIRLIB) PROGRAM是程序名,SRCS是所有编译的源文件,LIBS被设置为两个不同的文件-一个归档文件(file.a)和一个file.o文件。FC是gfortran,到目前为止,我还没有任何用于FLFLAGS的特定链接标志,而DIRLIB是库的主目录。问题是,构建我的库产生的*.o文件并不只驻留在主目录DIRLIB中。DIRLIB包含几个目录,每个目录都有我的代码所需的自己的*.o文件。
我尝试在-L选项后面添加每个单独的目录(例如,DIRLIB/DIR1/*.o DIRLIB/DIR2/*.o DIRLIB/DIR3/*.o),但最终开始收到一些子例程被多重定义的错误。所有这些用户定义库和归档文件的事情都让我感到困惑,而且我在制作makefile方面还是个新手,所以我在这里只是碰碰运气,希望有人能帮助我阐明这一点。
发布于 2012-03-28 21:31:13
在链接命令中,库需要位于引用它们的.o文件之后。
我猜LIBS中的对象文件在库之后,但需要库中的一些过程。您可以显示实际运行的命令(所有变量都展开了)来确认这一点吗?
发布于 2012-05-18 21:07:37
我尝试使用该库再次构建此代码。这一次起作用了。我非常确定我在makefile中做的事情和我之前做的一样,所以它一定与我的库有关。也许有人在一路上修改了它,无意中把它弄坏了。但我拿到了一本干净的图书馆。我的步骤是:
1)对库源文件运行makefile;它会创建一个库。归档文件
2)运行我的代码生成文件:
../library
$(FC) $(FLFLAGS) -o $@ $+ -L$(DIRLIB) -lskit
FC是我的编译器,FLFLAGS是我的链接标志,-L是指定要包含的库的位置的选项,-lskit是允许使用F77库的关键选项……如果没有-lskit选项,我会得到许多未定义的引用错误。这可能是我最后一次在最后没有包括这个-lskit选项。
https://stackoverflow.com/questions/9894116
复制相似问题