gpt4 book ai didi

gcc - 强制 CMake 使用静态库

转载 作者:行者123 更新时间:2023-12-04 15:58:51 24 4
gpt4 key购买 nike

[无耻地从 CMake 帮助列表中交叉发布]

我正在尝试尽可能静态地创建二进制文件。我得到的 fortran 代码有 X11 和 quadmath 作为依赖项,我遇到了许多问题(也许这些问题中的每一个都应该在不同的问题中?):

  • 我的变量目前是
    set(CMAKE_LIBRARY_PATH /usr/X11/lib /usr/X11/include/X11 ${CMAKE_LIBRARY_PATH})
    find_package(X11 REQUIRED)
    find_library(X11 NAMES X11.a PATHS /usr/X11/include/X11/ /usr/X11/lib)
    find_library(X11_Xaw_LIB NAMES Xaw Xaw /usr/X11/include/X11/ /usr/X11/lib ${X11_LIB_SEARCH_PATH})
    find_library(Xaw Xaw7 PATHS ${X11_LIB_SEARCH_PATH})

    set(CMAKE_LIBRARY_PATH /usr/lib/gcc/x86_64-linux-gnu/4.7 /usr/lib/gcc/x86_64-linux-gnu/4.7/x32 /usr/lib/gcc/x86_64-linux-gnu/4.7/32 ${CMAKE_LIBRARY_PATH})

    find_library(quadmath NAMES quadmath.a)

    set(BUILD_SHARED_LIBS ON)
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
    set(LINK_SEARCH_START_STATIC TRUE)
    set(LINK_SEARCH_END_STATIC TRUE)

    set(SHARED_LIBS OFF)
    set(STATIC_LIBS ON)

    set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")

  • 使用这些,CMake 尝试静态构建每个程序(如预期) - 但是,它失败了,因为我没有 Xaw.a - 我不知道这是否真的应该存在。我已经安装了最新的 libxaw7-dev我期待修复它。一种选择是自己编译 X11 库,但我真的不想这样做......
  • 如果我只注释掉 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") ,然后 CMake 编译所有内容,但为每个程序使用共享库,即使我指定了 .a 的位置我的 find_library() 中的 X11 库调用。我期待 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.

    但是,正如您可能已经注意到的,我设置了 libquadmath.a 的位置;当我构建一个不使用 X11 但使用 quadmath 的程序时
    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 的完整路径。

    关于gcc - 强制 CMake 使用静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18891290/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com