树莓派编译influxdb-cxx时找不到cpr::cpr目标的问题求助
树莓派编译influxdb-cxx时找不到cpr::cpr目标的问题
已在树莓派上完成InfluxDB安装,尝试通过influxdb-cxx库实现C++与InfluxDB通信,执行git clone https://github.com/offa/influxdb-cxx后编译始终提示找不到cpr::cpr目标。
随后克隆cpr库:git clone https://github.com/libcpr/cpr.git,但进入~/influxdb-cxx/build执行cmake ..仍报错:
-- ~~~ influxdb-cxx v0.7.1 ~~~ -- Build Type : RelWithDebInfo -- Boost support : ON -- Unit Tests : ON -- System Tests : ON -- Found cpr: /usr/local/lib/arm-linux-gnueabihf/libcpr.so -- Configuring done CMake Error at src/CMakeLists.txt:44 (add_library): Target "InfluxDB" links to target "cpr::cpr" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing? CMake Error at test/CMakeLists.txt:17 (add_executable): Target "LineProtocolTest" links to target "cpr::cpr" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing? Call Stack (most recent call first): test/CMakeLists.txt:33 (add_unittest) CMake Error at test/CMakeLists.txt:17 (add_executable): Target "LineProtocolTest" links to target "cpr::cpr" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing? Call Stack (most recent call first): test/CMakeLists.txt:33 (add_unittest)
以下是~/influxdb-cxx目录下的CMakeLists.txt内容:
#################################### # General project definition #################################### cmake_minimum_required(VERSION 3.12.0) # disable testsuite when included # using add_subdirectory if(DEFINED PROJECT_NAME) set(INCLUDED_AS_SUBPROJECT ON) set(INFLUXCXX_TESTING OFF CACHE BOOL "testing not available in sub-project") set(INFLUXCXX_SYSTEMTEST OFF CACHE BOOL "system testing not available in sub-project") set(INFLUXCXX_COVERAGE OFF CACHE BOOL "coverage not available in sub-project") endif() option(BUILD_SHARED_LIBS "Build shared versions of libraries" ON) option(INFLUXCXX_WITH_BOOST "Build with Boost support enabled" ON) option(INFLUXCXX_TESTING "Enable testing for this component" ON) option(INFLUXCXX_SYSTEMTEST "Enable system tests" ON) option(INFLUXCXX_COVERAGE "Enable Coverage" OFF) # Define project project(influxdb-cxx VERSION 0.7.1 DESCRIPTION "InfluxDB C++ client library" LANGUAGES CXX ) message(STATUS "~~~ ${PROJECT_NAME} v${PROJECT_VERSION} ~~~") # Add compiler flags for warnings if(NOT MSVC AND NOT INCLUDED_AS_SUBPROJECT) add_compile_options(-Wall -Wextra -pedantic -pedantic-errors -Werror -Wshadow -Wold-style-cast -Wnull-dereference -Wnon-virtual-dtor -Woverloaded-virtual ) endif() set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # We explicitly export the public interface set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) include(GenerateExportHeader) # Set fPIC for all targets set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Set the default build type to "RelWithDebInfo" if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE ) endif() message(STATUS "Build Type : ${CMAKE_BUILD_TYPE}") message(STATUS "Boost support : ${INFLUXCXX_WITH_BOOST}") message(STATUS "Unit Tests : ${INFLUXCXX_TESTING}") message(STATUS "System Tests : ${INFLUXCXX_SYSTEMTEST}") # Add coverage flags if(INFLUXCXX_COVERAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage") endif() #################################### # Dependencies #################################### list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") find_package(Threads REQUIRED) find_package(cpr REQUIRED) if (INFLUXCXX_WITH_BOOST) # Fixes warning when using boost from brew set(Boost_USE_MULTITHREADED TRUE) find_package(Boost REQUIRED COMPONENTS system) endif() add_subdirectory(3rd-party) #################################### # Library #################################### # Create library # note: BUILD_SHARED_LIBS specifies if static or shared # as boost is build without -fPIC, we cannot # statically link against it when building # influxdb as shared object add_subdirectory("src") #################################### # Tests #################################### if (INFLUXCXX_TESTING) enable_testing() add_subdirectory("test") endif() #################################### # Install #################################### include(GNUInstallDirs) # Build targets with install rpath on Mac to dramatically speed up installation # https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" isSystemDir) if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") if("${isSystemDir}" STREQUAL "-1") set(CMAKE_INSTALL_RPATH "@loader_path/../${CMAKE_INSTALL_LIBDIR}") endif() set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) endif() unset(isSystemDir) # Install library install(TARGETS InfluxDB EXPORT InfluxDBTargets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) # Create version file include(CMakePackageConfigHelpers) write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/cmake/InfluxDBConfigVersion.cmake" VERSION ${PACKAGE_VERSION} COMPATIBILITY AnyNewerVersion ) # Install headers install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") install(FILES ${PROJECT_BINARY_DIR}/src/influxdb_export.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") # Export targets install(EXPORT InfluxDBTargets FILE InfluxDBTargets.cmake NAMESPACE InfluxData:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/InfluxDB ) # Configure and install Config files configure_package_config_file( cmake/InfluxDBConfig.cmake.in cmake/InfluxDBConfig.cmake INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/InfluxDB" PATH_VARS CMAKE_INSTALL_PREFIX ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/InfluxDBConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmake/InfluxDBConfigVersion.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/InfluxDB )
解决方案
方案1:正确安装cpr库并生成CMake导入目标
克隆cpr后,必须完整编译安装才能让cmake识别到cpr::cpr目标:
# 进入cpr目录 cd ~/cpr mkdir build && cd build # 编译时关闭测试和示例,加快速度 cmake .. -DCPR_BUILD_TESTS=OFF -DCPR_BUILD_EXAMPLES=OFF # 编译安装 make -j$(nproc) sudo make install
然后清空influxdb-cxx的build目录缓存,重新cmake:
cd ~/influxdb-cxx/build rm -rf * cmake .. make -j$(nproc)
如果仍找不到,手动指定cpr的安装路径:
cmake .. -DCMAKE_PREFIX_PATH=/usr/local
方案2:使用influxdb-cxx自带的子模块
influxdb-cxx的3rd-party目录包含cpr子模块,直接初始化子模块即可自动编译依赖:
cd ~/influxdb-cxx # 初始化并更新所有子模块 git submodule update --init --recursive # 重新编译 cd build rm -rf * cmake .. make -j$(nproc)
问题原因
cmake提示找到cpr库文件,但找不到cpr::cpr目标,是因为只克隆cpr没有安装,或者安装时未生成CMake配置文件。cpr::cpr是cpr库提供的导入目标,需要通过cprConfig.cmake让cmake识别,只有完整编译安装cpr才会生成这个配置文件,或者使用自带子模块让cmake直接编译cpr源码。
内容的提问来源于stack exchange,提问作者dana
相关产品推荐
相关产品推荐

