CMake查找模块以区分共享库还是静态库

时间:2018-07-01 07:33:08

标签: c++ cmake shared-libraries static-libraries

我有一个使用libCrypto ++的cmake c ++项目。我有托管here的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安装):

  • /usr/lib/x86_64-linux-gnu/libcryptopp.a
  • /usr/lib/x86_64-linux-gnu/libcryptopp.so

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

1 个答案:

答案 0 :(得分:2)

实际上,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()

find_library()调用中临时更改了CMAKE_FIND_LIBRARY_SUFFIXES变量。

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

参考文献