You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:00:58