现代 Cmake 找不到 Eigen 库依赖

问题描述

长话短说:我有一个依赖于 Eigen3 的库 myLib,我试图在一个简单的测试项目中使用它。在 myLib 中一切正常,我可以毫无问题地使用 Eigen3,但对于无法构建和提出以下

 Fatal error: Eigen/Geometry: No such file or directory
   16 | #include <Eigen/Geometry>
      |          ^~~~~~~~~~~~~~~~

现在,更多细节:

我遇到了与 this 类似但不完全相同的问题。 我正在编写一个依赖于 Eigen3 的库,我正在使用现代 cmake 并遵循 this guide。 我的库工作并找到 Eigen3,我可以制作安装它并使用目标进行测试。问题是当我尝试在外部项目中使用它作为一个简单的项目时,我用来测试它是否工作正常(剧透警告:它没有)。

这是 myLib 库结构:

myLib
    - examples
        - tests
            - some tests
    - cmake 
        - myLib-config.cmake.in 
    - include
        - some includes
        - myalgo.h
    - src
        - some src
        - myalgo.cpp
        - CMakelits.txt #2
    - CMakelits.txt #1

使用 CMakeLists.txt #1:

cmake_minimum_required(VERSION 3.10)

# project name and version
project(myLib
  LANGUAGES CXX
  VERSION 0.0.1
)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_required True)

# add subdirectories
add_subdirectory(src)
add_subdirectory(examples)

和 CMakeLists.txt #2:

find_package(Eigen3 required)
find_package(yaml-cpp required) 

add_library(myLib
  ${PROJECT_SOURCE_DIR}/src/myAlgo.cpp
)
add_library(myLib::myLib ALIAS myLib)


option(BUILD_SHARED_LIBS "Build shared library" ON)
include(GenerateExportHeader)
generate_export_header(myLib
  EXPORT_MACRO_NAME MYLIB_API
  EXPORT_FILE_NAME ${CMAKE_BINARY_DIR}/include/myLib/core/common.h
)

# Compiler Options
get_target_property(Eigen3_INCLUDE_Dirs Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES)
target_compile_features(mylib PUBLIC cxx_std_17)
target_compile_options(myLib PRIVATE
  $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>:
    $<$<CONfig:Debug>:-O0 -Wall -Wextra>>
  $<$<CXX_COMPILER_ID:MSVC>:
    $<$<CONfig:Debug>:/Od /Wall /Zi>>
  )

target_include_directories(myLib
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/include>
    $<INSTALL_INTERFACE:include>
  PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
  )

target_link_libraries(myLib
  PUBLIC
    Eigen3::Eigen
    yaml-cpp
)

set_target_properties(myLib PROPERTIES
  ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
  LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
  RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)

include(GNUInstallDirs)
set(INSTALL_CONfigDIR ${CMAKE_INSTALL_LIBDIR}/cmake/myLib)

# install compiled library and install include directory and dependencies
install(TARGETS myLib
  EXPORT myLib-targets
  ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/myLib
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(DIRECTORY ${CMAKE_BINARY_DIR}/include/myLib
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

install(EXPORT myLib-targets
  FILE myLib-targets.cmake
  NAMESPACE myLib::
  DESTINATION ${INSTALL_CONfigDIR}
)

include(CMakePackageConfigHelpers)

write_basic_package_version_file(
  ${CMAKE_BINARY_DIR}/cmake/myLib-config-version.cmake 
  VERSION ${myLib_VERSION}
  COMPATIBILITY AnyNewerVersion
)

configure_package_config_file(
  ${CMAKE_SOURCE_DIR}/cmake/myLib-config.cmake.in
  ${CMAKE_BINARY_DIR}/cmake/myLib-config.cmake
  INSTALL_DESTINATION ${INSTALL_CONfigDIR} 
)  

install(
  FILES
  ${CMAKE_BINARY_DIR}/cmake/myLib-config.cmake
  ${CMAKE_BINARY_DIR}/cmake/myLib-config-version.cmake
  DESTINATION ${INSTALL_CONfigDIR} 
)

export(EXPORT myLib-targets
  FILE ${CMAKE_BINARY_DIR}/cmake/myLib-targets.cmake
  NAMESPACE myLib::
  )

export(PACKAGE myLib)

最后一个 myLib-config.cmake.in:

@PACKAGE_INIT@

include(CMakeFindDependencyMacro)
find_dependency(Eigen3 required)

if(NOT TARGET myLib::myLib)
    include(${CMAKE_CURRENT_LIST_DIR}/myLib-targets.cmake)
endif()

然后我制作并安装库,并通过 find_package(myLib) 在我的测试项目中使用它,它工作正常,直到我尝试导入使用 Eigen3 的 <myLib/myalgo> 并在尝试构建时导致以下错误

在 ~/Desktop/modern-cmake/examples/simple-project/simple_example.cpp:4 包含的文件中: /usr/local/include/myLib/myalgo.h:16:10: 致命错误:特征/几何: 无此文件或目录 16 | #include | ^~~~~~~~~~~~~~~~ 编译终止。

主要问题是:我怎样才能在 myLib 中携带本征?

我还有一个次要问题:我感觉我没有正确导入 yaml-cpp,对此有任何提示吗?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)