gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:02:40 26 4
gpt4 key购买 nike

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

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

set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})

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

target_link_libraries(${BIN_NAME} optimized tcmalloc_minimal)

生成的 makefile 链接到 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 的静态版本?

最佳答案

您可以创建一个辅助函数,在函数范围 (so therefore doesn't affect the parent scope) 中设置 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 ...

关于c++ - cmake:target_link_libraries 使用未共享的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36754160/

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