Ошибка cmake для библиотеки только для заголовков: `include не удалось найти файл загрузки` - PullRequest
0 голосов
/ 13 июля 2020

Я пытался преобразовать проект makefile c ++ в проект cmake, и у меня возникли некоторые трудности. cmake, похоже, ищет что-то в /usr/local/lib/ вместо /usr/local/include/, и я не уверен, почему это так.

Эта библиотека предназначена только для заголовков, поэтому я следил за этот учебник Моя библиотека только для заголовков в include, кажется, "строится" нормально, но я продолжаю получать следующую ошибку, когда пытаюсь сгенерировать make-файл для сборки моей примерной программы:

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 создает еще один проект fre sh:

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) 

Файл root directory 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, дословно скопированный из приведенного выше руководства.

Ответы [ 2 ]

3 голосов
/ 13 июля 2020

Ваш префикс установки указан как /usr/local/include, поэтому файлы будут установлены как:

  • заголовки в /usr/local/include/include
  • библиотеки в /usr/local/include/libs
  • смаковать вещи в /usr/local/include/share/${PROJECT_NAME}/cmake

Эти пути просто неверны. Просто установите CMAKE_INSTALL_PREFIX=/usr/local (ie. Удалите include) и установите его внутри /usr/local/ дерева.

0 голосов
/ 13 июля 2020

Некоторые позаботились об этой проблеме.

  1. в CMakeLists.txt измените install(DIRECTORY ${PROJECT_SOURCE_DIR}/include DESTINATION include) на install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/pf DESTINATION include), чтобы файлы не загромождали места установки. Для этого также необходимо создать pf/include/pf и переместить все файлы из pf/include в pf/include/pf.

  2. Следуйте советам в ответе @ KamilCuk .

  3. In examples/CMakeLists.txt измените file(GLOB SOURCES ${PROJECT_NAME}/*.{h,cpp}) на file(GLOB SOURCES ${CMAKE_SOURCE_DIR}/*.h ${CMAKE_SOURCE_DIR}/*.cpp)

Также обратите внимание, что мои /usr/local/lib и /usr/local/include были довольно загромождены из-за моего многочисленные предыдущие неудачные попытки, поэтому я удалил там кучу файлов и переустановил fre sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...