首页 > 解决方案 > Cmake查找模块以区分共享库或静态库

问题描述

我有一个使用 libCrypto++ 的 cmake c++ 项目。我在这里托管了 FindCryptoPP.cmake 模块。重要的部分是:

find_library(CryptoPP_LIBRARY
  NAMES cryptopp
  DOC "CryptoPP library"
  NO_PACKAGE_ROOT_PATH
  PATHS "/usr/lib/x86_64-linux-gnu/"
)
...
add_library(CryptoPP::CryptoPP UNKNOWN IMPORTED)
set_target_properties(CryptoPP::CryptoPP PROPERTIES
    IMPORTED_LOCATION "${CryptoPP_LIBRARY}"
    INTERFACE_INCLUDE_DIRECTORIES "${CryptoPP_INCLUDE_DIR}")

这工作正常,找到静态库文件(* .a)。现在我想创建单独的目标 CryptoPP::CryptoPP-static 和 CryptoPP::CryptoPP-shared。安装了必要的文件(默认 ubuntu 安装):

我想知道如何告诉 find_library 搜索静态或共享版本(最好以可移植方式 - 我需要所有 Linux、Windows、MacOS)并指定类型创建的目标。

标签: c++cmakeshared-librariesstatic-libraries

解决方案


实际上 CMake 的默认设置是先搜索共享库,然后再搜索静态库。

关键是CMAKE_FIND_LIBRARY_SUFFIXES全局变量中值的顺序,例如CMakeGenericSystem.cmake作为 CMake 的编译器/平台检测project()命令的一部分设置为:

set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")

如需解决方案,请查看现有的查找模块,例如FindBoost.cmake

# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
if( Boost_USE_STATIC_LIBS )
  set( _boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  if(WIN32)
    list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a)
  else()
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
  endif()
endif()

在这里,CMAKE_FIND_LIBRARY_SUFFIXES变量被临时更改为find_library()调用。

这里应该同样适用。find_library()如果您想进行两次相同的搜索,请注意确实会缓存其结果。

参考


推荐阅读