问题标签 [cmake-modules]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
518 浏览

c++ - 如何使用现代 CMake 安装捆绑的接口依赖项?

在 Modern CMake 中安装捆绑接口依赖项的正确方法是什么?

我有MyLib一个接口依赖于libDepMyLib.hpp包含#include <libDep.h>)的库。任何依赖的东西MyLib也都传递地依赖于libDep

libDep是从要点中获取的单个标头,因此我已将其包含在源树的一部分中MyLib

我想libDepmyLib, 在类似的路径中安装include/MyLib/third_party/libDep


这是 CMakeListsMyLib

MyLib位于libDep_ FindlibDep.cmake_CMAKE_MODULE_PATH


我安装MyLib喜欢

MyLibConfig.cmake.in声明依赖于libDep

libDep安装到MyLib的树中

我复制 find 模块


不幸的是,用户默认MyLib看不到FindlibDep.cmake

用户可以手动定位FindlibDep.cmake并将其添加到他们的CMAKE_MODULE_PATH位置,但这不是必需的。


GitHub 上提供了此问题的复制品。

0 投票
1 回答
4742 浏览

cmake - FindPackageHandleStandardArgs 究竟做了什么?

我正在尝试为已安装的软件包编写查找模块。但我无法理解 CMake 函数。

这是我的代码片段。

find_path()能够找到我zcm_INCLUDE_DIR的就好了:/usr/bin/zcm/usr/local/include

但是 find_package_handle_standard_args() 给出 -- Could NOT find zcm (missing: REQUIRED_VARS)

我的目录树如下所示:

我的理解是find_package_handle_standard_args()尝试在路径上找到包,这听起来很简单,因为路径已经确定。

至于REQUIRED_VARS文档,只需说“指定此包所需的变量”。对于像我这样的菜鸟来说,这并不能说明什么。

0 投票
1 回答
684 浏览

cmake - CMake 变量内容取决于构建/安装

使用$<INSTALL_INTERFACE:...>$<BUILD_INTERFACE:...>生成器表达式,我可以将目标属性设置为不同的值,具体取决于目标是在当前构建目录中导出还是全局安装。我正在编写一个自定义宏来配合我的 CMake 包和目标,并希望根据它的导出位置(在构建目录中)或安装位置使宏的行为有所不同。该宏包含在<package>-macros.cmake.in我的<package>-config.cmake文件中包含的 a 中,并使用配置到构建目录中configure_file并稍后安装。我尝试在使用configure_file命令设置的变量中使用生成器表达式,但显然它们不打算以这种方式工作。我认为我的要求并不少见,通常如何使用 CMake 完成?

0 投票
2 回答
1302 浏览

c++ - 在 cmake 中为 INTERFACE 库设置 LINK_FLAGS

我正在开发一个仅使用现代 CMake 的标头 C++11 库。所谓“现代”,我指的不仅是使用 CMake v3.0+,而且还尝试尽可能多地使用 Daniel Pfeifer演讲中的最佳实践。

我已经对我的问题进行了一些研究,但答案主要是关于LINK_FLAGS直接在全局级别修改,我不想这样做。现在,在我的项目中,3.9.0由于我正在使用一些功能,我需要最低版本的 CMake。

我的问题是关于是否/如何添加LINK_FLAGS来自我的两个依赖项:BLAS 和 LAPACK。基本上,我的CMakeLists.txt文件中有以下摘录:

据我从FindBLASFindLAPACK模块的文档中了解到,我需要至少通知我的用户有关{BLAS,LAPACK}_LIBRARIES{BLAS,LAPACK}_LINKER_FLAGS. 对于前者,我认为我已经妥善处理了这个问题。但是,对于后者,我需要使用set_target_propertiesor set_property。在两者之间,后者似乎给了我一个更清晰的解决方案,因为我可以同时使用来自Find{BLAS,LAPACK}模块的两个变量。当我尝试使用上述解决方案构建我的库时,我得到了明显的错误:

我的问题有两个方面:

  1. 我应该使用*_LINKER_FLAGS来自模块的所有,并且,
  2. 如果是,我应该如何将它们干净地集成到我的 CMake 项目中?

至于上面的 2.,我已经看到了一些使用的建议/答案target_link_libraries,但我不确定这是否是选择。

感谢您的时间!

0 投票
2 回答
4066 浏览

cmake - CMake find_package:它在哪里找到包?

在我的 CMake 包中,有一个对find_package. 这成功了,太好了!但是,事实证明是错误的软件包版本。我现在想去删除那个包。但是,我不知道它在我的系统上到底在哪里,也不-config.cmake知道 CMake 必须在某个地方找到的文件在哪里。有没有办法find_package给我这些信息?或者至少详细地告诉我它在哪里搜索?

我虽然这可能在变量CMAKE_MODULE_PATH中,但这对我来说是空的。所以我猜它在某个地方的默认路径中。但是 CMake 会在很多地方搜索包,而我在我记得的通常位置都没有找到它。

0 投票
1 回答
234 浏览

cmake - CMake 正在一个奇怪的位置搜索包

我一直在试图追查为什么 CMakefind_package在我的构建中找到了错误的包。从CMake find_package:它在哪里找到包?我学会了如何让它告诉我它正在搜索的路径,以及它在哪里找到了包。但是现在我需要弄清楚为什么CMake 正在搜索某个路径,因为它出于某种原因在非默认位置进行搜索。我检查了变量

但它们是空的。变量

是非空的,但它包含的只是

所以这不是原因。

还有什么可以让 CMake 搜索一些奇怪的前缀?

确切的问题如下:find_package(yaml-cpp)正在搜索如下:

它在最后一个路径中找到包配置文件。但那是一些其他代码的私有构建目录,所以我不知道为什么find_package要在那里搜索。一定是某个地方的某个变量告诉它这样做,但我不知道是哪一个。我不希望搜索此路径。

0 投票
1 回答
130 浏览

c++11 - CMake & C++ - 在几个 git 子模块之间共享库的最佳方法是什么

我正在处理包含 4 个子模块的大型 C++ 项目(使用 cLion)。我编写了小型 C++ 库,它提供了从 .properties 文件中读取的能力(在 Java 中最常见..)。

“Application.properties”文件应该包括公共变量和每个项目的变量。例如; 我正在使用 Elasticsearch 数据库,所有 4 个子模块都应该知道他的地址。此外,由于我有 4 个外国项目,我需要不断维护 5 个不同的 CMakeLists 文件(主项目的 4 个子模块 1)。

我的解决方案是在主项目根目录中设置共享代码,并通过在每个项目中包含库来使用它。

  • 项目和子模块的版本控制是 git。我想了想,决定也许我应该在开始写作之前检查更多评论。

怀着感激之情,科比。

0 投票
1 回答
1308 浏览

cmake - 如何从工具链文件中覆盖 cmake 模块的设置?

我有一个 CMake 工具链文件,可以在 x86_64-linux 主机上为 arm-linux 进行交叉编译。在配置期间,我的工具链文件被解析并且它(正确地)找到了一个 GNU 编译器。因此它将加载GNU.cmake(在我的情况下/usr/share/cmake-3.10/Modules/Compiler/GNU.cmake)。我不清楚这里的包含层次结构(找不到文档。任何链接都可以使用)。然而,它似乎是这样的:

  • CMakeLists.txtproject()
  • 我的工具链.cmake
  • 模块目录中的东西(包括GNU.cmake
  • 将变量加载%_INIT%缓存变量
  • 之后继续project()

假设我希望这个目标仅使用 -O2 优化来构建。我将它设置在我的工具链中,因为它对于许多项目都是全局的。

但随后GNU.cmake被加载并附加“-O3”。因此我的设置被覆盖。在此之后,我只能在我的项目CMakeLists.txt文件中覆盖它。我必须为每个项目都这样做,开发人员会错过这个!

所以,我的问题是(重复标题):如何从工具链文件中覆盖 CMake 模块的设置?

0 投票
0 回答
1038 浏览

dll - 如何使用 CMake 将接口与静态库链接

我想要的是一个基于接口的主库(将来不止一个)。该接口必须由其他库使用,例如 lib1 和 lib2。这个想法是将 lib1 和 lib2 创建为静态的,然后将它们链接到 mainLib,它必须是一个共享库。

对于这个例子,假设我只使用 lib1,因为 lib2 的过程是相同的。

我的问题是我真的不知道如何正确链接库。首先,我需要将接口库与 lib1 链接,因此它成为一个新的静态库,并且这个必须与 mainlib 共享库链接。

我正在尝试制作一个具有以下结构的项目:

这是我在 cmakelists 中使用的代码版本:

主库

界面

库1

所以,我需要在定义的 ${PRODUCT_TARGET} 处安装所有标题。但我需要按照项目的相同结构来做。现在,所有的 hpp 都安装在同一个文件夹 (${PRODUCT_TARGET}) 中。

该接口未与我的 lib1 链接,因为它需要一个不在导出集中的目标“接口”,我不知道如何解决它,因为我无法在接口中设置安装属性,因为很多错误。

一旦 lib1 包含接口。我想将它与 mainlib 链接。我只是用它做一个 target_link_libraries,但我不确定这是链接与静态库共享的正确方法。

编辑: 我可以使用此代码生成 de 共享库,但是当我尝试使用它并且包含 lib.hpp 时,它找不到接口的标题。我真的不知道问题出在哪里...

所有建议表示赞赏。

0 投票
0 回答
155 浏览

c++ - 如何检查 pkg_check_modules 在哪里找到模块?

我是新手CMAKE,现在我正在尝试建立一个C++图书馆并面临一些问题。

我试图了解它是如何PKG_CHECK_MODULES (3RD_PARTY_LIB REQUIRED stream)工作的。我阅读了文档,据说:

设置“REQUIRED”参数时,如果找不到模块,宏将失败并出现错误

问题是应该没有stream安装模块,但PKG_CHECK_MODULES不会失败。我添加了以下内容

它打印以下内容

但该目录/home/rjtor/work/libsrv/3rdp/stream/include并不真正存在。

有没有办法检查为什么stream找到示例中的模块?如何查看它的位置?