如何创建正确的 Find***.cmake 文件

Posted

技术标签:

【中文标题】如何创建正确的 Find***.cmake 文件【英文标题】:How to create proper Find***.cmake file 【发布时间】:2020-06-01 02:39:53 【问题描述】:

我为我的项目编写了一个简单的 Find***.cmake 文件,该文件在 Windows 上运行良好,

if(WIN32)
    find_path(Shaderc_INCLUDE_DIR
            NAMES shaderc/shaderc.hpp
            PATH "$ENVVULKAN_SDK/Include")
    find_library(Shaderc_LIBRARY
            NAMES shaderc_combined
            PATH "$ENVVULKAN_SDK/Lib")
elseif(UNIX)
    find_path(Shaderc_INCLUDE_DIR
            NAMES shaderc/shaderc.hpp
            PATH "$ENVSHADERC_DIR/include")
    find_library(Shaderc_LIBRARY
            NAMES libshaderc_combined
            PATH "$ENVSHADERC_DIR/lib")
endif()
set(Shaderc_INCLUDE_DIRS $Shaderc_INCLUDE_DIR)
set(Shaderc_LIBRARIES $Shaderc_LIBRARY)

,但在 Linux 上会引发错误。错误信息是:

CMake 错误:此项目中使用了以下变量,但是 它们被设置为 NOTFOUND。请设置它们或确保它们已设置 并在 CMake 文件中正确测试:Shaderc_LIBRARY

如果我将此代码复制到我的主 CMakeLists 文件中,它也可以在 Linux 上正常编译。我做错了什么?为此目的在 Linux 上使用环境变量是一种不好的做法吗?

感谢您的帮助!

【问题讨论】:

欢迎来到 Stack Overflow! “不起作用”的描述不是我们可以帮助您的描述。究竟如何观察到这种“不起作用”?你有错误信息吗?或者某些变量的值错误?请edit 问题帖子并在其中添加更多详细信息。另请参阅How to Ask。 对于 Windows,您使用 VULKAN_SDK 变量,但对于 Linux,使用 SHADERC_DIR 变量。 Linux 上变量SHADERC_DIR 的值是多少?根据您的假设应该找到库libshaderc_combined确切路径(和文件名)是什么? 【参考方案1】:

嗯,从代码来看,你的模块在环境变量指定的目录中查找。

相反,您应该让它在知名位置进行搜索,例如 /usr/lib/usr/local/lib

【讨论】:

谢谢!所以,当我使用来自 github 的库时,我应该将内容符号链接到 /usr/lib 和 usr/include,而不是使用环境变量? @arrowd:问题中的代码看起来 both 进入特定目录(由特定于包的环境变量表示)和特定于系统的目录。这是在 CMake 中搜索事物的推荐和广泛使用的方法。在/usr/lib/usr/include 中添加符号链接绝对是个坏主意。

以上是关于如何创建正确的 Find***.cmake 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CMake 中正确创建目标之间的依赖关系?

如何通过CMake查找特定/本地文件

Cmake中find_package命令的搜索模式之配置模式(Config mode)

Cmake命令之find_package介绍

CMake中find_path的使用

ubuntu find_package 找不到 qt5