cmake:target_link_libraries 使用未共享的静态库

新手上路,请多包涵

是否可以告诉 cmake 链接到 静态库 而不是 shared

在我的 CMakeLists.txt 的顶部,我配置了以下内容:

 set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})

后来,我添加了一个二进制文件,并告诉它在发布模式下链接到 tcmalloc

 target_link_libraries(${BIN_NAME} optimized tcmalloc_minimal)

生成的生成文件链接到 tcmalloc 的共享版本:

 $ make VERBOSE=1 | grep tcmalloc
/usr/bin/c++ ... -Wl,-Bdynamic ltcmalloc_minimal

进一步证明:

 $ ldd app
    ...
    libtcmalloc_minimal.so.4 => /usr/local/lib/libtcmalloc_minimal.so.4 (0x00007eff89733000)
    ...

tcmalloc 的静态和共享版本都存在:

 $ ls -1 /usr/local/lib/libtcmalloc_minimal*
/usr/local/lib/libtcmalloc_minimal.a
/usr/local/lib/libtcmalloc_minimal_debug.a
/usr/local/lib/libtcmalloc_minimal_debug.la
/usr/local/lib/libtcmalloc_minimal_debug.so
/usr/local/lib/libtcmalloc_minimal_debug.so.4
/usr/local/lib/libtcmalloc_minimal_debug.so.4.2.6
/usr/local/lib/libtcmalloc_minimal.la
/usr/local/lib/libtcmalloc_minimal.so
/usr/local/lib/libtcmalloc_minimal.so.4
/usr/local/lib/libtcmalloc_minimal.so.4.2.6

问题:

如何配置 cmake 以链接 tcmalloc 的静态版本?

原文由 Steve Lorimer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

您可以创建一个辅助函数,该函数在函数范围内设置 CMAKE_FIND_LIBRARY_SUFFIXES因此不会影响父范围),该函数搜索相关库并使用结果设置输出变量

function(find_static_library LIB_NAME OUT)

    if (WIN32 OR MSVC)
        set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
    elseif (UNIX)
        set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
    endif()

    find_library(
        FOUND_${LIB_NAME}_STATIC
        ${LIB_NAME}
        )

    if (FOUND_${LIB_NAME}_STATIC)
        get_filename_component(ABS_FILE ${FOUND_${LIB_NAME}_STATIC} ABSOLUTE)
    else()
        message(SEND_ERROR "Unable to find library ${LIB_NAME}")
    endif()

    set(${OUT} ${ABS_FILE} PARENT_SCOPE)

endfunction()

然后,您可以从 CMakeLists.txt 中的某个位置调用此函数,以使用库的位置填充变量。

找不到它会导致硬故障

find_static_library(tcmalloc_minimal TCMALLOC)

然后,您可以在调用 target_link_libraries 时使用此变量,并确保您链接的是静态版本

target_link_libraries(${BIN_NAME} optimized ${TCMALLOC})

在这里你可以看到结果:

 $ make VERBOSE=1 | grep tcmalloc

 /usr/bin/c++ ... /usr/local/lib/libtcmalloc_minimal.a ...

原文由 Steve Lorimer 发布,翻译遵循 CC BY-SA 3.0 许可协议

您必须以这种方式设置您的 CMAKE_FIND_LIBRARY_SUFFIXES 变量:

 set(CMAKE_FIND_LIBRARY_SUFFIXES .a)

因为在默认的 CMAKE_FIND_LIBRARY_SUFFIXES 中还有 .so 后缀(而且它似乎没有按插入顺序搜索)。为了允许可移植性,应添加其他后缀(有关不同平台上 CMAKE_FIND_LIBRARY_SUFFIXES 的默认值,请参见 此处)。

原文由 Francesco Argese 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题