使用cmake构建时,如果cmake已经提供了查找模块,请防止第三方库使用其自己的查找模块实现 重新措辞的问题
如何控制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构建时,如果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策略。我不知道如何通过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开发人员应该为他们提供的如此愚蠢的解决方案负责。