如何在CMake中指定链接类型

How to specify the linking type in CMake?

本文关键字:链接 类型 CMake      更新时间:2023-10-16

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

我们使用几个宏来调整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)没有直接的方法来确定它是静态库还是动态库。

在CMake中find_library可以用于此目的。

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