是否可以告诉 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/