CMake的找到区分共享的模块或静态库(Cmake find module to distingui

2019-09-30 20:58发布

我有一个使用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静态和CryptoPP :: CryptoPP共享。 必要的文件安装(Ubuntu默认安装):

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

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

Answer 1:

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

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

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

对于一个解决方案来看看现有的Find模块像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()如果你想要做同样的搜索两次做缓存其结果。

参考

  • 对于CMAKE_FIND_LIBRARY_PREFIXES / CMAKE_FIND_LIBRARY_SUFFIXES默认值
  • CMake的find_library匹配的行为吗?
  • “find_library”在C进行循环返回相同的值


文章来源: Cmake find module to distinguish shared or static library