首页 > 解决方案 > 仅标头库的 cmake 错误:`include 找不到加载文件`

问题描述

我一直在尝试将 makefile c++ 项目更改为 cmake 项目,并且遇到了一些困难。cmake似乎正在寻找东西/usr/local/lib/而不是,/usr/local/include/我不确定为什么会这样。

这个库是纯头文件,所以我一直在关注本教程我的纯头文件库include似乎“构建”得很好,但是当我尝试生成一个生成文件来构建我的示例程序时,我不断收到以下错误:

me:~/pf/examples/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at /usr/local/lib/cmake/pf/pfConfig.cmake:27 (include):
  include could not find load file:

    /usr/local/lib/cmake/pf/pf_exampleTargets.cmake
Call Stack (most recent call first):
  CMakeLists.txt:15 (find_package)

examples/CMakeLists.txt创建另一个新项目:

project(pf_example)

cmake_minimum_required (VERSION 3.12)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

set(CMAKE_CXX_FLAGS "-Wall -Wextra")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_STANDARD 17)

# "install" pf
find_package(pf CONFIG REQUIRED)
find_package(Eigen3 3.3 REQUIRED NO_MODULE)

file(GLOB SOURCES ${PROJECT_NAME}/*.{h,cpp})
message("${SOURCES}")
add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} pf::pf) 

根目录CMakeLists.txt文件比较复杂。这是根据我上面提到的教程改编的:

cmake_minimum_required(VERSION 3.12)

project("pf" VERSION 1.0.1
             DESCRIPTION "A header only c++ template library for fast particle filtering."
             HOMEPAGE_URL "https://github.com/tbrown122387/pf")

include(GNUInstallDirs)

add_library(${PROJECT_NAME} INTERFACE)

target_include_directories(
  ${PROJECT_NAME}
  INTERFACE $<BUILD_INTERFACE:${${PROJECT_NAME}_SOURCE_DIR}/include>
            $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)

target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_17)


install(TARGETS ${PROJECT_NAME}
        EXPORT ${PROJECT_NAME}_Targets
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake"
                                 VERSION ${PROJECT_VERSION}
                                 COMPATIBILITY SameMajorVersion)


configure_package_config_file(
  "${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in"
  "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
  INSTALL_DESTINATION
  ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake)

install(EXPORT ${PROJECT_NAME}_Targets
        FILE ${PROJECT_NAME}Targets.cmake
        NAMESPACE ${PROJECT_NAME}::
        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake)


install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
              "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake)

install(DIRECTORY ${PROJECT_SOURCE_DIR}/include DESTINATION include)

为了安装这个只有头文件的库,在我尝试构建示例项目之前,我在命令行中输入了以下命令:

cd ~/pf
mkdir build
cd build/
cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/include
sudo cmake --build . --config Release --target install -- -j $(nproc)

我没有发布它,但还有一个文件cmake/pfconfig.cmake.in是从上面的教程中逐字复制的。

标签: c++cmake

解决方案


您的安装前缀指定为,/usr/local/include因此文件将安装为:

  • 标头进入/usr/local/include/include
  • 图书馆进入/usr/local/include/libs
  • cmake 东西到/usr/local/include/share/${PROJECT_NAME}/cmake

这些路径是错误的。只需设置CMAKE_INSTALL_PREFIX=/usr/local(即删除include)并将其安装在/usr/local/树内。


推荐阅读