【问题标题】:c++ conflicting versions when loading packagec++ 加载包时版本冲突
【发布时间】:2015-09-14 16:34:20
【问题描述】:

我对@9​​87654321@ 一无所知。我安装了一些名为ITK 的软件包的两个版本。出于某种原因,4.8 版本的.cmake 文件位于/usr/local/lib/cmake/ITK-4.8/UseITK.cmake3.16 文件/usr/local/itk/lib/InsightToolkit/UseITK.cmake 中。

所以现在,我正在尝试构建一些需要3.16 版本的项目,该版本在其CMakeLists.txt 中:

find_package(ITK)
...
include( ${ITK_USE_FILE} )

${ITK_USE_FILE}/usr/local/lib/cmake/ITK-4.8/UseITK.cmake。 (据我了解,ITK 使用ITK_USE_FILE 作为Package_INCLUDE_DIR 变量)。如何使find_package 指向3.16 版本?

【问题讨论】:

    标签: cmake package vtk itk


    【解决方案1】:

    在查找包之前检查文件/usr/local/itk/lib/InsightToolkit/ITKConfig.cmake是否存在并将ITK_DIR变量设置为/usr/local/itk/lib/InsightToolkit

    # CMakeLists.txt
    ...
    set(ITK_DIR /usr/local/itk/lib/InsightToolkit)
    find_package(ITK)
    

    或者,如果您希望您的项目也可以在其他计算机上运行,​​请将此变量传递给 cmake 调用:

    cmake -DITK_DIR=/usr/local/itk/lib/InsightToolkit (...)
    

    CMakeLists.txt 在这种情况下保持不变)。


    根据消息来源,FindITK.cmake(由find_package(ITK) 命令触发)只是将请求重定向到 Config 模式:

    # FindITK.cmake
    ...
    find_package(ITK ${_ITK_REQUIRED} ${_ITK_QUIET} NO_MODULE
        NAMES ITK InsightToolkit
        CONFIGS ITKConfig.cmake
        )
    

    但不将VERSION 参数传递给它。这就是设置版本不起作用的原因。

    设置ITK_DIR 强制CMake 首先在给定目录下搜索ITKConfig.cmake。更多详情请见find_package documentation

    【讨论】:

    • 对不起,我对c++ 几乎一无所知。你的意思是设置cmake -DITK_DIR=需要重新编译ITK。还是我的项目需要 ITK 的参数?顺便说一句,是否可以在 CMakeLists.txt 中设置此 ITK_DIR
    • 您的项目需要 ITK 的参数。是的,您可以在 CMakeLists.txt 中设置变量:set(ITK_DIR /use/local/itk)。顺便说一句,你的意思是“我对CMake 几乎一无所知”?这是 CMake 的详细信息,而不是 c++。
    • 我在find_package(ITK)之前设置了set(ITK_DIR "/use/local/itk") jsut,然后${ITK_USE_FILE}仍然指向错误的版本/usr/local/lib/cmake/ITK-4.8/UseITK.cmake。我错了吗?
    • 文件/usr/local/itk/lib/InsightToolkit/ITKConfig.cmake 真的存在吗?您是否执行干净的配置(使用空的构建目录)? CMAKE_PREFIX_PATH 变量是否未设置? (您可以通过message() 命令查看其值)。
    • 顺便说一句,使用绝对路径设置`ITK_USE_FILE`和ITK_INSTALL_PREFIX 似乎可以正确加载CMakeLists.txt。现在我遇到了一堆奇怪的file not found 错误,因为检测到两次出现为somefile.hsomefile.txx 的文件(因此检测到包含ITK 目录)但那些只显示为somefile.h 的文件没有未检测到somefile.txx。怎么可能?
    【解决方案2】:

    按照 CMake documentation,您可以请求找到特定版本的包。您需要将CMakeLists.txt 更改为:

    find_package(ITK)
    

    到:

    find_package(ITK 3.16)
    

    【讨论】:

    • 这是行不通的,因为当我安装 3.16 版本时,我没有得到任何带有 3.16 tag 的目录。当我重新加载CMakeLists.txt 时,我收到了这条消息Warning:By not providing "Find3.16.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "3.16", but CMake did not find one. Could not find a package configuration file provided by "3.16" with any of the following names: 3.16Config.cmake 3.16-config.cmake
    • @Newben,根据错误消息,您尝试查找名称为“3.16”的包,例如find_package(3.16)。但答案中的代码不同。
    • @Tsyvarev find_package(ITK 3.16) 不起作用。我试过这个set( ITK_USE_FILE "/usr/local/itk/lib/InsightToolkit/UseITK.cmake" ) set( ITK_INSTALL_PREFIX "/usr/local/itk" ),这有助于加载“CMakeLists.txt”,但是当我编译代码时,我发现尽管ITK_INSTALL_PREFIX下有文件,但找不到文件
    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2019-08-07
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多