【问题标题】:config Eigen in CMakeLists.txt file在 CMakeLists.txt 文件中配置 Eigen
【发布时间】:2020-03-09 04:41:04
【问题描述】:

当我在 CMakeLists.txt 文件中配置 Eigen 库时:

cmake_minimum_required(VERSION 3.14)
project(helloworld)

add_subdirectory(tests)
add_subdirectory(deps/eigen) 

set(SRC_LIST main.cpp)
add_executable(hello ${SRC_LIST})
find_package(Eigen3 3.3 REQUIRED NO_MODULE)
target_link_libraries(hello eigen)

我得到了 cmake 错误

CMake Error at build/deps/eigen/Eigen3Config.cmake:20 (include):
  The file

    /Users/joe/codecplus/build/deps/eigen/Eigen3Targets.cmake

  was generated by the export() command.  It may not be used as the argument
  to the include() command.  Use ALIAS targets instead to refer to targets by
  alternative names.

Call Stack (most recent call first):
  CMakeLists.txt:9 (find_package)

谁能帮帮我?不知道这里出了什么问题。非常感谢。

【问题讨论】:

    标签: c++ cmake eigen


    【解决方案1】:

    您使用两种方式同时包含 3d 方项目(Eigen)

    1. add_subdirectory()

    2. find_package()

    这是错误的。采取单一方式:

    1. 仅限add_subdirectory

      add_subdirectory(deps/eigen) 
      # ...
      target_link_libraries(hello Eigen3::eigen)
      
    2. 仅限find_package()

      find_package(Eigen3 3.3 REQUIRED NO_MODULE)
      target_link_libraries(hello Eigen3::eigen)
      

    请注意,这两种方法都使用Eigen3::eigen 目标而不是eigen 进行链接。只有这个名称适用于第二种方法,它在 Eigen 用法的文档中有所描述。

    【讨论】:

    • 在配置模式下使用find_package() 时,CMake 是否足够聪明,可以知道在构建树子目录中查找,因为这是它要查找的文件 (Eigen3Config.cmake) 的生成位置?如果不是,它会不会只在默认目录中查找可能有两种可能的结果:它根本找不到文件,或者它找到并使用系统上安装的库,而不是与项目捆绑在一起的库?
    • @Pesho_T:“... CMake 足够聪明,可以知道在构建树子目录中查找” - 不,CMake 不会自动在构建树中搜索。实际上,是export(PACKAGE) 命令流将包脚本的路径(在给定情况下为/Users/joe/codecplus/build/deps/eigen/Eigen3Targets.cmake)存储到“CMake 用户包注册表”中。在其他地方,find_package 在此注册表中搜索包。因此,find_package 会找到 Eigen 包,即使 Eigen 是与主项目单独构建的。
    • @Tsyvarev 关于您的答案的另一个问题是,target_link_libraries(hello eigen) 中的“特征”是什么?它只是deps/eigen 的文件夹名称还是某个库名称?因为我在deps/eigen目录及其所有子目录中没有找到任何名为eigen的文件?
    • @Jeff:eigenINTERFACE library目标。它使用add_library (eigen INTERFACE) 创建并与它链接自动 添加包含目录和使用Eigen 库所需的其他标志。实际上,最好使用Eigen3::eigen 目标:它不仅使用add_subdirectory 方法定义,还使用find_package() 定义。我已经更正了答案。
    • @Tsyvarev 非常感谢您的帮助。 “实际上,它是 export(PACKAGE) 命令流,它将包脚本的路径(在给定的情况下是 /Users/joe/codecplus/build/deps/eigen/Eigen3Targets.cmake)存储到“CMake 用户包注册表”中。”这什么时候发生?是在构建外部包(Eigen)的时候吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-25
    • 1970-01-01
    • 2022-08-05
    • 2016-11-12
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多