[无耻地从 CMake 帮助列表中交叉发布]
我正在尝试尽可能静态地创建二进制文件。我得到的 Fortran 代码有 X11 和quadmath 作为依赖项,并且我遇到了许多问题(也许每个问题都应该在不同的问题中?):
使用这些,CMake 尝试构建every静态编程(如预期)-但是,它失败了,因为我没有Xaw.a
- 我不知道这是否真的应该存在。我已经安装了最新的libxaw7-dev
我期待修复它。一种选择是自己编译 X11 库,但我真的不想这样做......
如果我只注释掉set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
,然后 CMake 编译所有内容,but即使我指定了每个程序的位置,也使用共享库.a
我的 X11 库find_library()
来电。我期望 CMake 在可以的地方使用 .a 文件,然后只使用共享库 - 有没有办法强制这种行为?
-
有谁知道这里描述的错误的修复方法:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46539; gfortran 似乎无法静态链接 libquadmath?我尝试使用 gcc 进行修复,但无法让 CMake 识别 libgfortran 标志:
cmake -DCMAKE_Fortran_COMPILER=gcc -DCMAKE_Fortran_FLAGS=-gfortran
结果是
-- The Fortran compiler identification is unknown
-- Check for working Fortran compiler: /usr/bin/gcc
-- Check for working Fortran compiler: /usr/bin/gcc -- broken
CMake Error at /usr/share/cmake-2.8/Modules/CMakeTestFortranCompiler.cmake:54 (message):
The Fortran compiler "/usr/bin/gcc" is not able to compile a simple test program.
However正如您可能已经注意到的,我设置了 libquadmath.a 的位置;当我构建一个不使用 X11 但使用quamath 的程序时
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
然后程序确实编译成功(运行 ldd 报告“不是动态可执行文件”) - 这是否意味着错误已被修复,或者它只是因为我在 CMake 中设置了位置而起作用?
我也有类似的问题。事实证明,cmake 隐式链接了 libgfortran 和 libquadmath。为了解决这个问题,我将以下内容放入我的顶级 CMakeLists.txt 中:
unset(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES)
然后我可以使用以下命令再次显式链接库:
SET_TARGET_PROPERTIES(main_f PROPERTIES LINKER_LANGUAGE "C"
LINK_FLAGS
"/usr/local/Cellar/gcc/7.1.0/lib/gcc/7/libgfortran.a
/usr/local/Cellar/gcc/7.1.0/lib/gcc/7/libquadmath.a -lm -lgcc"
)
libgfortran 的静态版本是必要的,因为共享库还依赖于 libquadmath。添加的“-lm”和“-lgcc”引入了这些库的系统动态版本。在 Mac 系统上,您还需要使用 libm.a 的完整路径。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)