【问题标题】:Link Linux C++ application statically via CMake 2.8通过 CMake 2.8 静态链接 Linux C++ 应用程序
【发布时间】:2016-06-29 21:25:37
【问题描述】:

我在 Ubuntu 14.04 / GCC 4.8 / CMake 2.8 中使用 -static-libgcc 和 -static-libstdc++ 构建了应用程序。 ldd 命令显示:

linux-vdso.so.1 =>  (0x00007ffc16195000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcb18256000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fcb17f50000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcb17b8a000)
/lib64/ld-linux-x86-64.so.2 (0x000055fc367e1000)

当我将 -static 添加到 CMAKE_EXE_LINKER_FLAGS - 我从 ldd 得到不同的输出:

linux-vdso.so.1 =>  (0x00007ffd48349000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe8d0335000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe8d0031000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe8cfd2a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe8cf965000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x000055d61ec7d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe8cf74f000)

我认为 -static 标志将导致静态链接应用程序。它没有发生。 谁能解释一下为什么?

我有由 Qt Creator 生成的 makefile - 使用 -static 开关生成完全静态的应用程序。

【问题讨论】:

    标签: c++ linux cmake


    【解决方案1】:

    -static-static-libgcc-static-libstdc++ 的不同之处在于-static 不假定标准库的静态链接。这两个标志控制此行为。

    要与标准库静态链接,请将这两个标志添加到 CMake CMAKE_EXE_LINKER_FLAGS 变量。

    【讨论】:

    • 这些标志已在 CMAKE_EXE_LINKER_FLAGS 中设置。真正的问题是导致可执行文件仍然依赖于 Linux 动态库(请参阅上面帖子中的 ldd 输出)。我的目标是进行完整的静态构建。
    【解决方案2】:

    它来自生成的 CMakeLists.txt。我在运行 CMake 时使用 -DSTATIC_LINKING=True。

    IF(STATIC_LINKING)
        SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
    ENDIF(STATIC_LINKING)
    
    
    # libpcap library
    find_library(pcap libpcap.a)
    
    # opencore-amr libraries
    find_library(opencore-amrnb libopencore-amrnb.a)
    find_library(opencore-amrwb libopencore-amrwb.a)
    
    # c++ netlib
    find_library(cppnetlib-server-parsers libcppnetlib-server-parsers.a)
    find_library(cppnetlib-uri libcppnetlib-uri.a)
    find_library(cppnetlib-client-connections libcppnetlib-client-connections.a)
    
    # pthread
    find_library(pthread libpthread.a)
    
    # boost libraries
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_MULTITHREADED ON)
    
    # set -static, when STATIC_LINKING is TRUE and set LINK_SEARCH_END_STATIC
    # to remove the additional -bdynamic from the linker line.
    IF(STATIC_LINKING)
        SET(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++"
        SET_TARGET_PROPERTIES(pvqa-server PROPERTIES LINK_SEARCH_END_STATIC 1)
    ENDIF(STATIC_LINKING)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2012-02-15
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多