我有一个使用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安装):
我想知道如何告诉find_library搜索静态版本或共享版本(最好以可移植的方式搜索-我需要所有Linux,Windows,MacOS)并指定创建的类型。
答案 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()
会缓存其结果。