假设我已经编写了一个库<mylib>
,可以通过cmake构建一个安装。我还有一个<mylib>Config.cmake
文件,可以定位所有必要的文件(库、头、.)并为图书馆导出一个目标。
如果我想在find_package(...)
中使用这个库,cmake需要知道配置文件的位置。我知道每次我使用库构建一个项目时都可以传递这个函数,或者我可以(对于cmake3.13和更新版本)将<mylib>_ROOT
环境变量指向它。
但是有一个解决方案对我来说要简单得多:我可以使用export(PACKAGE <PackageName>)
命令在cmake注册表中注册一个包。但是,如果我正确理解它的文档,这只允许注册构建目录。我的构建目录通常既不包含配置文件,也不包含可能需要的其他东西,比如包含文件。当然,我可以在那里复制它们,但是如果我已经在安装目录中很好地设置了所有内容,我为什么要这样做呢?
因此,我的问题是:
export(PACKAGE ...)
只支持构建目录的注册的原因是什么?发布于 2021-02-28 18:41:07
不鼓励使用CMake包注册表,因为它很容易更改系统上其他构建的行为。来自最新文件 (重点雷):
在3.15版本中更改:默认情况下,
export(PACKAGE)
命令什么也不做(参见策略CMP0090
),因为填充用户包注册表会在源和构建树之外产生影响。设置CMAKE_EXPORT_PACKAGE_REGISTRY
变量以将生成目录添加到CMake用户包注册表。
如果这个问题是一个XY问题,一个更好的工作流就是选择一个通用的安装前缀,比如/path/to/prefix
,然后通过-DCMAKE_PREFIX_PATH=/path/to/prefix
将每个需要包的构建指向它。在转到下一个项目之前,先按依赖顺序构建每个项目,然后再构建cmake --install /path/to/build --prefix /path/to/prefix
。
这使您不必为每个依赖项设置_ROOT
变量,因为您已经将它们全部安装到相同的前缀中。CMAKE_PREFIX_PATH
也是CMake为初始化相应的CMake变量而读取的为数不多的环境变量之一,因此您可以在shell中设置它,以避免手动键入-D...
。为了避免影响系统上的其他项目,像戴伦夫这样的东西可能对管理设置和取消设置CMAKE_PREFIX_PATH
很有用。
https://stackoverflow.com/questions/55660319
复制相似问题