我有一个使用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的),并指定类型创建的目标。
实际上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进行循环返回相同的值