我正在尝试编译克努特(一个数学程序)在带有 CMake 的 Arch Linux 上,我收到以下错误:
/usr/bin/ld: cannot find -lgfortran
/usr/bin/ld: cannot find -lquadmath
collect2: error: ld returned 1 exit status
make[2]: *** [cli/CMakeFiles/knut-cli.dir/build.make:101: cli/knut-cli] Error 1
make[1]: *** [CMakeFiles/Makefile2:498: cli/CMakeFiles/knut-cli.dir/all] Error 2
make: *** [Makefile:128: all] Error 2
我相信gfortran
和quadmath
都已安装,并且链接似乎也正确:
$ ls -al /usr/lib | grep "fortran"
lrwxrwxrwx 1 root root 20 Jun 3 23:11 libgfortran.so -> libgfortran.so.3.0.0
lrwxrwxrwx 1 root root 20 Jun 3 23:11 libgfortran.so.3 -> libgfortran.so.3.0.0
-rwxr-xr-x 1 root root 5858448 Jun 3 23:11 libgfortran.so.3.0.0
-rw-r--r-- 1 root root 269 Jun 3 03:11 libgfortran.spec
$ ls -al /usr/lib | grep "libquadmath"
lrwxrwxrwx 1 root root 20 Jun 3 23:11 libquadmath.so -> libquadmath.so.0.0.0
lrwxrwxrwx 1 root root 20 Jun 3 23:11 libquadmath.so.0 -> libquadmath.so.0.0.0
-rwxr-xr-x 1 root root 958384 Jun 3 23:11 libquadmath.so.0.0.0
相同的 .so 文件也可以在/usr/lib64
.
我有 gfortran 版本 6.1.1。我不太了解 CMake,所以我尝试在 cmake 命令中更改的唯一内容是添加-D CMAKE_PREFIX_PATH=/usr/lib
,但这没有帮助。
有什么建议我可以如何继续找到问题吗?
编辑1
我已经运行了,cmake
但没有后续make
,似乎所有依赖项都得到满足:
- The C compiler identification is GNU 6.1.1
-- The CXX compiler identification is GNU 6.1.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The Fortran compiler identification is GNU 6.1.1
-- Check for working Fortran compiler: /usr/bin/gfortran
-- Check for working Fortran compiler: /usr/bin/gfortran -- works
-- Detecting Fortran compiler ABI info
-- Detecting Fortran compiler ABI info - done
-- Checking whether /usr/bin/gfortran supports Fortran 90
-- Checking whether /usr/bin/gfortran supports Fortran 90 -- yes
-- The shell is found: /usr/bin/sh
-- The C++ runtime library is /usr/lib/gcc/x86_64-pc-linux- gnu/6.1.1/../../../../lib/libstdc++.a
-- The FORTRAN runtime library is libgfortran.a, /usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/libgcc.a and libquadmath.a
-- The DYNAMIC FORTRAN runtime library is /usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/../../../../lib/libgfortran.so
-- openBLAS was found as /usr/lib64/libopenblas.so.
-- Using system UMFPACK and AMD: /usr/lib64/libumfpack.so and /usr/lib64/libamd.so.
-- The includes are at /usr/include and /usr/include.
-- Using system LAPACK and ARPACK /usr/lib64/liblapack.so;/usr/lib64/libarpack.so.
-- The mxml library is /usr/lib64/libmxml.so.
-- The mxml include directory is /usr/include.
-- --> Qt5Core found.
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mark/knut/knut/build
当我随后运行时,会出现上述错误make
。
编辑2
我注意到我的 /usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/ 不包含静态库libgfortran.a
和libquadmath.a
.我gcc-4.8.5
在另一台计算机上存在这些文件。从cmake
输出来看,这两个库似乎没有找到,因为没有给它们提供路径。
现在我不确定这意味着什么,这是否是我的 gfortran 安装的问题还是其他问题?
编辑3 6 月 24 日
libgfortran 的问题似乎是 Arch 特有的。显然,Arch 中通常不打包静态库。这就是为什么 Debian 中的同一个 gcc-fortran 软件包包含文件 libgfortran.a 和 libquadmath.a 而在 Arch 中则不然。我已更改 PKGBUILD 中的选项以options=('staticlibs')
包含下一次编译的静态库(使用腹肌)。然后我将生成的 libgfortran.a 和 libquadmath.a 文件复制进去/usr/lib/gcc/x86_64-pc-linux-gnu/6.1.1/
,libgfortran 的问题似乎解决了。
但是,我现在收到 Knud Larsen 提到的 Qt5 错误。
答案1
https://github.com/rs1909/knut/tree/master/knut
/usr/bin/ld: 找不到 -lgfortran
/usr/bin/ld: 找不到 -lquadmath
请阅读 knut/knut/knut.spec.cmake → Buildrequires: libgfortran-static .... 即 libgfortran。A
-lquadmath 可能相同:libquadmath.a
(我的 cmake 配置没有出现任何错误:Makefile 已创建。)
6 月 23 日编辑 1:上面似乎只是一个配置示例:Makefile 已创建。
构建示例:PCLinuxOS 2016、CentOS 7、Fedora 24 因 Qt5 错误而失败。
- Debian 8 Jessie:没有问题,除了 cmake 在
knut/knut/build/src/config.h
. $make
和 #make install
都可以。 gfortran、g++ 的版本为 4.9.2 。 “libgfortran-4.9-dev”提供libgfortran.a、libquadmath.a
编辑 2,6 月 23 日:使用 Ubuntu 16.04 进行构建...尝试更高版本的编译器 gcc-5.3.1 ...
cd knut/knut/build/ && CC=gcc-5 CXX=g++-5 FC=gfortran-5 cmake .. && make && sudo make install
- 没有问题 ....
编辑3:使用 gcc/g++/gfortran 版本测试 knut6.1.1→ Debian 9 延伸。
CC=gcc-6 CXX=g++-6 FC=gfortran-6 cmake .. && make ; # make install
- 也还可以。
编辑4:构建要求..#apt-get install g++ libopenblas-dev libqt5svg5-dev
从以上所有我可以得出的结论是,所使用的Qt5必须适合。 Qt5配置可能有差异?打补丁? ...我没有发现 Qt5 文件位置有任何重要的区别。