c++ - 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 安装):
- /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")
如需解决方案,请查看现有的查找模块,例如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()
如果您想进行两次相同的搜索,请注意确实会缓存其结果。
参考
推荐阅读
- java - 如何使用 selenium java 单击图库视图中的所有可用元素
- html - 随机为图像的各个部分着色
- node.js - 我正在尝试使用护照 js 创建身份验证,但是在 router.get 中传递参数(护照)时出现错误
- spring-security - Java Spring 应用程序 - 与 Azure AD 集成以实现 SSO
- python - 你真的不应该在mac上更新你的全局python版本吗?
- python - 为什么我收到 ModuleNotFoundError openpyxl
- python - Discord.py 按钮不允许多个用户同时使用该按钮
- php - 在 Laravel 8 中自定义 Jetstream 注册页面验证错误消息
- python - Python Bot-Framework 主动消息
- git - 了解 git diff 和 git cherry-pick 的工作原理