问题描述
长话短说:我有一个依赖于 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)
@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 (将#修改为@)