CMake无法找到通过apt安装的libcoap3包,求解决方法
问题背景
在Linux环境下用CMake构建C++应用,vcpkg管理大部分依赖,但因vcpkg无libcoap3端口,通过apt install libcoap3-dev安装该依赖。执行CMake配置时,始终提示找不到libcoapConfig.cmake或libcoap-config.cmake文件,无法定位libcoap3包。
构建步骤
cmake --preset=default cmake --build build
相关CMakeLists.txt代码
cmake_minimum_required(VERSION 3.21) project(test VERSION 3.0 LANGUAGES C CXX) # ... 省略部分代码 ... find_package(coap REQUIRED) add_executable(test main.cxx) target_link_libraries(test PRIVATE coap::coap)
错误信息
CMake Error at /home/pi/vcpkg/scripts/buildsystems/vcpkg.cmake:898 (_find_package):
By not providing "Findlibcoap.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "libcoap", but
CMake did not find one.Could not find a package configuration file provided by "libcoap" with any
of the following names:libcoapConfig.cmake libcoap-config.cmakeAdd the installation prefix of "libcoap" to CMAKE_PREFIX_PATH or set
"libcoap_DIR" to a directory containing one of the above files. If
"libcoap" provides a separate development package or SDK, be sure it has
been installed.
Call Stack (most recent call first):
CMakeLists.txt:11 (find_package)
解决方案
方法一:直接指定头文件与库路径(最简单)
apt安装的libcoap3-dev默认将头文件放在/usr/include/coap3/,库文件放在/usr/lib/(arm架构可能是/usr/lib/arm-linux-gnueabihf/或/usr/lib/aarch64-linux-gnu/)。修改CMakeLists.txt,绕过find_package直接配置:
cmake_minimum_required(VERSION 3.21) project(test VERSION 3.0 LANGUAGES C CXX) # ... 省略部分代码 ... add_executable(test main.cxx) # 添加libcoap3头文件路径 target_include_directories(test PRIVATE /usr/include/coap3) # 链接libcoap3库 target_link_libraries(test PRIVATE coap-3)
方法二:自定义Find模块适配find_package
如果希望保留find_package的写法,可手动编写CMake查找模块:
- 在项目根目录创建
cmake/modules文件夹 - 创建
cmake/modules/Findlibcoap.cmake,内容如下:
find_path(LIBCOAP_INCLUDE_DIR NAMES coap3/coap.h) find_library(LIBCOAP_LIBRARY NAMES coap-3) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(libcoap DEFAULT_MSG LIBCOAP_LIBRARY LIBCOAP_INCLUDE_DIR) if(LIBCOAP_FOUND) add_library(coap::coap UNKNOWN IMPORTED) set_target_properties(coap::coap PROPERTIES IMPORTED_LOCATION "${LIBCOAP_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${LIBCOAP_INCLUDE_DIR}" ) endif() mark_as_advanced(LIBCOAP_INCLUDE_DIR LIBCOAP_LIBRARY)
- 在CMakeLists.txt开头添加模块路径,调整find_package命令:
cmake_minimum_required(VERSION 3.21) project(test VERSION 3.0 LANGUAGES C CXX) # 添加自定义CMake模块路径 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") # ... 省略部分代码 ... find_package(libcoap REQUIRED) add_executable(test main.cxx) target_link_libraries(test PRIVATE coap::coap)
方法三:检查并指定系统配置文件路径(如果存在)
部分版本的libcoap-dev包可能自带CMake配置文件,先搜索系统中是否存在:
sudo find /usr -name "*libcoap*.cmake"
如果找到类似/usr/lib/cmake/libcoap/libcoapConfig.cmake的文件,配置CMake时指定路径:
cmake --preset=default -Dlibcoap_DIR=/usr/lib/cmake/libcoap
或在CMakeLists.txt中提前设置:
set(libcoap_DIR "/usr/lib/cmake/libcoap" CACHE PATH "libcoap CMake配置文件路径") find_package(coap REQUIRED)
内容的提问来源于stack exchange,提问作者Dark Sorrow

