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

标签 c++ linux cmake

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

相关文章:

c++ - 在不调用 uac 的情况下启动服务

linux - 如何将 `config.sh` 中的变量包含到 `a.sh` 和 `b.sh` 中?

C++ 模式 : 1x base class + Nx derived classes BUT with a _last resort_ derived class

c++ - C++中的初始化二维 vector

c - 将 mprotect 系统调用注入(inject)跟踪进程失败并出现 EFAULT

linux - centos 7 挂载网盘 : mount error(13): Permission denie

configuration - CMake 是否有更高级别的抽象来检测 32 位/64 位构建?

cmake - 在自定义命令中调用找到的可执行文件的正确方法?

build - 创建一个新的 cmake 输入变量

c++ - 函数重载和模板