【问题标题】:How to specify the linking type in CMake?如何在 CMake 中指定链接类型?
【发布时间】:2013-05-04 21:02:06
【问题描述】:

在我的 CMake 脚本中,我需要为我的项目所链接的不同库指定 gcc 的不同链接类型。众所周知,使用-Wl,-Bstatic-Wl,-Bdynamic 选项进行此类混合。但是可以在 cmake 脚本中以某种方式指定吗?

【问题讨论】:

    标签: c++ gcc cmake


    【解决方案1】:

    我们使用几个宏来调整 CMake 在 Linux/MacOSX 上的首选搜索顺序,以便在动态链接库和静态链接库之间切换

    macro( prefer_static )
        if( NOT WIN32 )
            list( REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES   ".a" )
            list( INSERT      CMAKE_FIND_LIBRARY_SUFFIXES 0 ".a" )
        endif()
    endmacro()
    
    macro( prefer_dynamic )
        if( NOT WIN32 )
            list( REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ".a" )
            list( APPEND      CMAKE_FIND_LIBRARY_SUFFIXES ".a" )
        endif()
    endmacro()
    

    然后我们在调用find_library(...)find_package(...) 之前调用适当的prefer_static()prefer_dynamic() 例程。这具有在静态库不可用时“退回”共享库的优势,反之亦然。

    这不适用于 Windows 构建,因为您总是使用 Visual Studio 链接到 .lib 文件,并且 (AFAIK) 没有直接的方法来确定它是静态库还是动态库。

    【讨论】:

    • 您也可以增强宏以在用户定义路径中查找库!很好的逻辑。
    【解决方案2】:

    在 CMake 中 find_library 可用于此目的。

    find_library(VAR libMyLib.a)SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") find_library(VAR MyLib)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2020-08-16
      相关资源
      最近更新 更多