编译时链接其他目录下.a库的问题求助(Fortran+Makefile场景)
解决Fortran编译时找不到libcfitsio.a库的问题
嘿,刚入门Fortran和Makefile遇到这种路径问题太正常了,我来帮你把这个问题捋清楚!
首先先给你拆解一下你当前编译命令里各个参数的作用,搞懂了就知道问题出在哪:
-O3:开启编译器最高级别的优化选项,这个没问题-o main:指定最终生成的可执行文件名叫mainSOURCE/main.f90等文件:你指定的源文件路径,这部分是对的-fopenmp:你理解的没错,这个参数是让编译器启用OpenMP的并行支持,会自动链接OpenMP相关的库-L.:这就是问题的核心!-L是告诉编译器去哪里找你要链接的库文件,.代表的是你当前执行命令的目录(也就是ROOT目录),但你的libcfitsio.a明明在SOURCE目录里,编译器在ROOT目录当然找不到它-lcfitsio:这个参数是告诉编译器要链接名为libcfitsio.a的库(编译器会自动把-lxxx转换成查找libxxx.a或者libxxx.so)
知道问题所在后,有两种简单的解决办法:
方法1:修改库搜索路径(推荐)
把-L.改成-LSOURCE,告诉编译器去SOURCE目录下找库文件,修改后的完整命令是:
ifort -O3 -o main SOURCE/main.f90 SOURCE/foo.f90 SOURCE/bar.f90 -fopenmp -LSOURCE -lcfitsio
方法2:直接指定库文件的完整路径
如果你不想记-L和-l的规则,也可以直接把SOURCE/libcfitsio.a作为编译参数加进去,这样编译器会直接使用这个指定路径的库文件,命令如下:
ifort -O3 -o main SOURCE/main.f90 SOURCE/foo.f90 SOURCE/bar.f90 -fopenmp SOURCE/libcfitsio.a
这两种方法都能解决你当前的链接错误,选哪种都可以。如果后续你要完善Makefile的话,还可以把SOURCE目录定义成一个变量,比如SRC_DIR := SOURCE,然后用$(SRC_DIR)来引用,这样后续修改路径会更方便。
内容的提问来源于stack exchange,提问作者Alex Howard
相关产品推荐
相关产品推荐

