Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用cmake构建时,如果cmake已经提供了查找模块,请防止第三方库使用其自己的查找模块实现 重新措辞的问题_Cmake_Openscenegraph - Fatal编程技术网

使用cmake构建时,如果cmake已经提供了查找模块,请防止第三方库使用其自己的查找模块实现 重新措辞的问题

使用cmake构建时,如果cmake已经提供了查找模块,请防止第三方库使用其自己的查找模块实现 重新措辞的问题,cmake,openscenegraph,Cmake,Openscenegraph,如何控制CMake使用FindXXX.CMake模块的顺序 我的问题 例如,OpenSceneGraph自带的FindZLIB不如Cmake自带的FindZLIB。OSG自带的FindZLIB模块无法找到我的ZLIB安装。我已在CMAKE_INSTALL_前缀路径中安装了ZLIB 在构建过程中,cmake警告我这一点 OSG将模块路径设置为自己的目录,因此FindPNG(来自CMake)不正确地使用了附带的FindZLIB OpenSceneGraph。因此,它无法找到ZLIB 我怎样才能防止这

如何控制CMake使用FindXXX.CMake模块的顺序

我的问题 例如,OpenSceneGraph自带的FindZLIB不如Cmake自带的FindZLIB。OSG自带的FindZLIB模块无法找到我的ZLIB安装。我已在CMAKE_INSTALL_前缀路径中安装了ZLIB

在构建过程中,cmake警告我这一点

OSG将模块路径设置为自己的目录,因此FindPNG(来自CMake)不正确地使用了附带的FindZLIB OpenSceneGraph。因此,它无法找到ZLIB

我怎样才能防止这种情况发生? 我正在通过调用ExternalProject\u Add来构建OpenSceneGraph。我读过设置cmake策略(准确地说是CMP0017)可能会修复它吗?我不知道如何通过ExternalProject\u Add做到这一点

更多细节 这是cmake(从生成的visual studio解决方案调用)尝试配置和生成OSG时的相关警告: 4> C:/Program Files(x86)/CMake 2.8/share/CMake-2.8/Modules/FindPNG处的CMake警告(dev)。CMake:34(查找程序包):


您可以简单地设置前面提到的cmake策略。我不知道如何通过ExternalProject\u add实现这一点,但它确实解决了这个问题。源发行版附带的CMakeLists.txt文件有一个部分,其中已经设置了一些cmake策略。您可以添加一行,将CMP0017策略设置为NEW,并消除此警告

if (COMMAND cmake_policy)
    ...

    cmake_policy (SET CMP0017 NEW)

    ...
endif ()

您可以简单地设置前面提到的cmake策略。我不知道如何通过ExternalProject\u add实现这一点,但它确实解决了这个问题。源发行版附带的CMakeLists.txt文件有一个部分,其中已经设置了一些cmake策略。您可以添加一行,将CMP0017策略设置为NEW,并消除此警告

if (COMMAND cmake_policy)
    ...

    cmake_policy (SET CMP0017 NEW)

    ...
endif ()

我想您必须修改OpenSceneGraph的
CMakeLists.txt
。搜索一行,可能看起来像:
set(CMAKE\u MODULE\u PATH${CMAKE\u SOURCE\u DIR}/CMAKE/modules${CMAKE\u MODULE\u PATH})
。换句话说,它将OSG自己的模块搜索路径放在CMake的前面。@Haroogan感谢Haroogan的评论。我知道OSG是如何改变模块路径的。它也有自己的模块,因此需要设置模块路径,以便使用它们。我不能简单地删除那一行。修改它也不比简单地删除OSG中的FindZLIB模块好多少。我更喜欢一种不涉及以任何方式更改OSG源代码的解决方法。当然,不要删除这一行,只需将顺序更改为:
set(CMAKE_MODULE_PATH${CMAKE_MODULE_PATH}${CMAKE_SOURCE_DIR}/CMAKE/modules)
,以便CMAKE模块优先于OSG模块,并根据CMAKE默认规则找到ZLib。不幸的是,我认为你别无选择,OSG开发人员应该为他们提供的如此愚蠢的解决方案负责。我想你必须修改OpenSceneGraph的
CMakeLists.txt
。搜索一行,可能看起来像:
set(CMAKE\u MODULE\u PATH${CMAKE\u SOURCE\u DIR}/CMAKE/modules${CMAKE\u MODULE\u PATH})
。换句话说,它将OSG自己的模块搜索路径放在CMake的前面。@Haroogan感谢Haroogan的评论。我知道OSG是如何改变模块路径的。它也有自己的模块,因此需要设置模块路径,以便使用它们。我不能简单地删除那一行。修改它也不比简单地删除OSG中的FindZLIB模块好多少。我更喜欢一种不涉及以任何方式更改OSG源代码的解决方法。当然,不要删除这一行,只需将顺序更改为:
set(CMAKE_MODULE_PATH${CMAKE_MODULE_PATH}${CMAKE_SOURCE_DIR}/CMAKE/modules)
,以便CMAKE模块优先于OSG模块,并根据CMAKE默认规则找到ZLib。不幸的是,我认为你别无选择,OSG开发人员应该为他们提供的如此愚蠢的解决方案负责。