【问题标题】:What is the default search path for find_package in windows using cmake?使用 cmake 在 windows 中 find_package 的默认搜索路径是什么?
【发布时间】:2014-01-23 17:10:21
【问题描述】:

我正在将一些代码移植到 Windows 上,我的 cmake 使用 Libavahi 检查包

find_package(Libavahi)

我有标头、dll 等,但我不确定将它们放在哪里以便 cmake 找到它们。

我可以把这些文件放在哪里让 cmake 找到?它们位于名为 usr 的文件夹中。

我看到模块路径是使用:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

但我想知道是否还会搜索默认位置

【问题讨论】:

标签: cmake


【解决方案1】:

CMake manual 完全指定了不同find_* 命令的相当复杂的搜索顺序。不幸的是,由于 Windows 缺少 /usr/local/lib 的默认目录结构,因此很难在这里找到合理的默认值。

管理目录最可靠的方法之一是通过环境变量提示。您只需将$ENV{MY_VAR} 添加到 find 命令的HINTS 部分,然后在项目的自述文件中记录该环境变量。大多数能够编译 C++ 程序的用户都知道如何使用环境变量,这比每次都必须在命令行上提供路径要方便得多(尽管将其作为附加选项永远不会有什么坏处)。

对于find_package,CMake 在 Windows 上提供了一种称为package registry 的特殊机制。 CMake 在HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\ 下的 Windows 注册表中维护一个包信息列表。从源代码构建的包可以使用export 命令在那里注册。稍后在同一台机器上构建的其他项目无需额外配置即可找到该包。如果您需要在同一台机器上从源代码构建大量相互依赖的项目,这将非常强大。

更新:从 3.12 版开始,CMake 现在为每个 find_package 调用提供 implicitly considers the <PackageName>_Root environment variable a HINT

【讨论】:

  • $ENV{VAR} 提示 +1。这正是我在我的项目中使用的并且运行良好(即使在 Unix 上)。
  • 我已经用 HINTS 参数指定了文件的目录。在 Linux 上,libavahi 的 NAMES 参数是 libavahi-client.so。我试过libavahi-client.dll.a,位于(使用提示)C:/Documents\ and\ Settings/IEUser/My\ Documents/Downloads/avahi-client/usr/lib/,但仍然没有运气。有什么推荐吗?
  • 导出方式比全局 C:\Program Files (x86)\CMake\share\cmake-3.3\Modules 目录好!
  • 如果有人像我一样是 cmake 语法迟到的人......这是一个示例行(请注意 OpenCV 是我的包,我在环境变量中创建了 OPENCV_DIR 并且它指向打开的 cv 构建我系统上的目录(来自源代码)):find_package(OpenCV REQUIRED HINTS $ENV{OPENCV_DIR})
猜你喜欢
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2018-11-18
  • 2018-09-23
  • 1970-01-01
  • 2012-03-27
  • 2023-03-22
相关资源
最近更新 更多