将 libgfortran 与 CMAKE 链接的可移植方式

Posted

技术标签:

【中文标题】将 libgfortran 与 CMAKE 链接的可移植方式【英文标题】:Portable way of linking libgfortran with CMAKE 【发布时间】:2015-09-05 19:47:19 【问题描述】:

我的一个可执行文件需要libgfortran.so。通常我只需将-lgfortran 开关添加到编译行,它就会自动与g++ 链接。但是,我正在尝试使用 CMAKE 查找库:

find_library(GFORTRAN_LIBRARY NAMES gfortran)
target_link_libraries(ncorr_test $GFORTRAN_LIBRARY)

但是,这无法找到库。事实证明,到目前为止唯一可行的方法是,如果我像这样包含整个库名称:

find_library(GFORTRAN_LIBRARY NAMES libgfortran.so.3)
target_link_libraries(ncorr_test $GFORTRAN_LIBRARY)

然后,它将正确链接:

/usr/bin/c++ ... /usr/lib/x86_64-linux-gnu/libgfortran.so.3 ...

但是,包括整个.so.3 不是很便携。有谁知道更好的方法来做到这一点?通常,我需要使用的库只是安装在 /usr/local/lib 中,并搜索没有“lib”和扩展名的库名称(即 find_library(FFTW_LIBRARY NAMES fftw3) 会在 /usr/local/lib 中找到 libfftw3.a 就好了)。

编辑:

find_library(GFORTRAN_LIBRARY NAMES libgfortran.so) 也不起作用。到目前为止,只有libgfortran.so.3 有效。

使用locate libgfortran 输出:

/usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.so
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.spec
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortranbegin.a
/usr/lib/x86_64-linux-gnu/libgfortran.so.3
/usr/lib/x86_64-linux-gnu/libgfortran.so.3.0.0
/usr/local/MATLAB/R2014a/sys/os/glnxa64/libgfortran.so.3
/usr/local/MATLAB/R2014a/sys/os/glnxa64/libgfortran.so.3.0.0
/usr/share/doc/libgfortran-4.8-dev
/usr/share/doc/libgfortran3
/var/lib/dpkg/info/libgfortran-4.8-dev:amd64.list
/var/lib/dpkg/info/libgfortran-4.8-dev:amd64.md5sums
/var/lib/dpkg/info/libgfortran3:amd64.list
/var/lib/dpkg/info/libgfortran3:amd64.md5sums
/var/lib/dpkg/info/libgfortran3:amd64.postinst
/var/lib/dpkg/info/libgfortran3:amd64.postrm
/var/lib/dpkg/info/libgfortran3:amd64.shlibs
/var/lib/dpkg/info/libgfortran3:amd64.symbols

EDIT2:

现在我只要求用户将libgfortran.a 复制到他们的usr\local\lib 目录

【问题讨论】:

【参考方案1】:

看起来您要么错过了 linux 发行版上的 dev 包,它应该安装 .so 链接,要么在 cmake 查找时缺少此类链接所在的路径。尝试找到libgfortran.so链接,通常它与.so.3所在的位置相同,如果找不到,请安装缺少的开发包,如果您可以检查为什么该路径未包含在cmake中。

【讨论】:

我在编辑的帖子中添加了更多内容。看来 CMAKE 只搜索 /usr/lib/x86_64-linux-gnu/,其中只包含 libgfortran.so.3。它不在包含libgfortran.alibgfortran.so/usr/lib/gcc/x86_64-linux-gnu/4.8/ 中查找。 你找到让 CMake 搜索 /usr/lib/gcc/ 的方法了吗?

以上是关于将 libgfortran 与 CMAKE 链接的可移植方式的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Glew 与 Cmake 链接

将 armadillo/blas/lapack 与 cmake 链接(未定义对 `dgemv_' 的引用)

将 GLEW 与 cmake 链接的问题

CMake:将Fortran与静态C库链接失败

将 GLEW 与 CMake 连接起来

如何使用cmake生成基于静态库的动态链接库