【问题标题】:How to enable pkg-config support in eigen3 on Windows?如何在 Windows 的 eigen3 中启用 pkg-config 支持?
【发布时间】:2018-12-02 10:34:42
【问题描述】:

我正在编译一个第三方库,它使用以下命令来查找 Eigen3:

find_package( PkgConfig )
pkg_check_modules( EIGEN3 REQUIRED eigen3 )
include_directories(${EIGEN3_INCLUDE_DIRS})

find_package( PkgConfig ) 命令运行正确,因为我指定了PKG_CONFIG_EXECUTABLE 变量。但是pkg_check_modules( EIGEN3 REQUIRED eigen3 )返回错误:

-- 检查模块 'eigen3'

-- 找不到包'eigen3'

Eigen3 的official webpage 说“没有必要使用 CMake 或安装任何东西。”我花了很长时间才意识到这种说法是错误的。所以我运行以下代码来编译和安装 Eigen3(版本 3.3.5):

cmake -DCMAKE_CONFIGURATION_TYPES=Release -DCMAKE_INSTALL_PREFIX=E:\3rd-parties\eigen-3.3.5\install_ -G"Visual Studio 14 2015 Win64" ..

编译和安装过程都成功了,因为我在VS2015中没有看到任何失败。但是,当我回到 3rd 方库的 build 文件夹并再次运行 cmake 时,我得到了完全相同的错误。 Eigen3 official website只提供了使用find_package的指令,而不提供pkg-config.exe,所以我接下来搜索谷歌找到了这个thread。答案说我们需要“在 eigen3 cmake 中启用 pkg-config 支持”。我不知道如何启用它。为此目的是否有任何特定的 CMake 变量?由于这是一个新问题,Eigen's main page 说“要获得帮助,stackoverflow 是您最好的资源。”所以我来这里寻求帮助。我的问题是:如何在 eigen3 中启用 pkg-config 支持?或者换一种说法:如何传递pkg_check_modules( EIGEN3 REQUIRED eigen3 ) cmake 命令?非常感谢。

PS:我正在使用 Windows 10。

【问题讨论】:

    标签: cmake eigen3 pkg-config


    【解决方案1】:

    根据 Eigen3 sources,一个选项 EIGEN_BUILD_PKGCONFIG 负责 pkg-config 支持。

    在 Windows 上,整个选项被禁用,但您可以尝试设置它:

    cmake -DEIGEN_BUILD_PKGCONFIG=ON <... other arguments>
    

    在CMake脚本中使用pkg-config查找Eigen3时,确保Eigen3的安装目录在CMAKE_PREFIX_PATH变量中。 (如果项目使用的 CMake 版本低于 3.1,则需要额外设置 PKG_CONFIG_USE_CMAKE_PREFIX_PATHON,以便告诉 pkgconfig 模块使用变量 CMAKE_PREFIX_PATH。更多信息请参见 documentation for pkgconfig模块。)

    【讨论】:

    • 感谢您的回复。我在构建 Eigen3 时添加了 EIGEN_BUILD_PKGCONFIG 选项,它适用于 Windows。创建了一个新文件夹E:\3rd-parties\eigen-3.3.5\install_\share\pkgconfig,其中有一个文件eigen3.pc。但是在我尝试了CMAKE_PREFIX_PATH 的各种值后,pkg-config.exe 仍然无法找到 Eigen3。您能否再给我一个关于如何指示pkg-config 定位 Eigen3 安装位置的帮助?非常感谢。
    • 嗯,将选项 -DCMAKE_PREFIX_PATH=E:/3rd-parties/eigen-3.3.5/install_ 传递给 cmake(或 CMake GUI 中的相应设置)应该可以工作。
    • 对不起,它不起作用。 CMAKE_PREFIX_PATH 的文档说它支持 find_package()、find_program()、find_library()、find_file() 和 find_path()。这是否意味着 CMAKE_PREFIX_PATH 仅适用于这些函数,但不适用于 pkg_check_modules()?
    • 我猜对了,pkg_check_modules 使用 FindPkgConfig(),而 CMAKE_PREFIX_PATH 仅适用于 find_package()、find_program()、find_library()、find_file() 和 find_path()。 FindPkgConfig()中有一个变量控制是否使用CMAKE_PREFIX_PATH——PKG_CONFIG_USE_CMAKE_PREFIX_PATH。如果最低 CMake 版本 >= 3.1,则默认启用它,但我正在编译的第 3 方库恰好将其设置为 2.8 .....我已经编辑了你的答案以包含这个技巧。
    • 我已将您的编辑改写为更简单的形式,其中说明了特定的低版本 CMake。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2015-04-16
    • 2015-02-24
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多