问题 使用cmake的windows中find_package的默认搜索路径是什么?


我将一些代码移植到Windows和我的cmake检查包使用Libavahi

find_package(Libavahi)

我有标题,DLL等,但我不知道在哪里放置这些cmake会找到它们。

我在哪里可以通过cmake找到这些文件?他们在一个名为的文件夹中 usr

我看到使用以下命令指定模块路径:

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

但我想知道是否有一个默认位置也会被搜索


6774
2018-01-23 17:10


起源

您可能想查看答案 “用cmake找到libavahi”,其中包含指向cmake文档相关部分的链接。 - iljau


答案:


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

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

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

更新:从版本3.12开始,立即CMake 隐含地考虑了 <PackageName>_Root 环境变量 HINT 为每一个人 find_package 呼叫。


15
2018-01-24 08:51



$ ENV {VAR}小费+1。这正是我在我的项目中使用并且工作得很好(甚至在Unix上)。 - André
我用HINTS参数指定了文件的目录。在Linux上,libavahi的NAMES参数是 libavahi-client.so。我试过了 libavahi-client.dll.a,位于(使用HINTS)in C:/Documents\ and\ Settings/IEUser/My\ Documents/Downloads/avahi-client/usr/lib/ 但仍然没有运气。有什么建议? - JuJoDi
+1导出命令 - Danduk82
导出方法比那个全局C:\ Program Files(x86)\ CMake \ share \ cmake-3.3 \ Modules目录好! - Oliver Zendel
如果有人像我这样的cmake语法...这是一个示例行(请注意,OpenCV是我的包,我在环境变量中创建了OPENCV_DIR,它指向我系统上的open cv build目录(来自源代码) ):find_package(OpenCV REQUIRED HINTS $ ENV {OPENCV_DIR}) - Sneaky Polar Bear