如何在 CMake 中指定链接类型?

Posted

技术标签:

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

在我的 CMake 脚本中,我需要为我的项目所链接的不同库指定 gcc 的不同链接类型。众所周知,使用-Wl,-Bstatic-Wl,-Bdynamic 选项进行此类混合。但是可以在 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)

【讨论】:

以上是关于如何在 CMake 中指定链接类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CMake 中指定编译器?

尽管在 CMake 中指定了库,但未定义的引用错误(与 libtorch 链接的问题(C++11 ABI?)

在 CMakeLists 文件中指定构建目录

如何在类型提示中指定函数类型?

如何在构建脚本中指定链接器标志/参数?

如何在链接或表单中指定 DELETE 方法?