问题标签 [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.
c++ - 如何使用现代 CMake 安装捆绑的接口依赖项?
在 Modern CMake 中安装捆绑接口依赖项的正确方法是什么?
我有MyLib
一个接口依赖于libDep
(MyLib.hpp
包含#include <libDep.h>
)的库。任何依赖的东西MyLib
也都传递地依赖于libDep
。
libDep
是从要点中获取的单个标头,因此我已将其包含在源树的一部分中MyLib
我想libDep
用myLib
, 在类似的路径中安装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 上提供了此问题的复制品。
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
文档,只需说“指定此包所需的变量”。对于像我这样的菜鸟来说,这并不能说明什么。
cmake - CMake 变量内容取决于构建/安装
使用$<INSTALL_INTERFACE:...>
和$<BUILD_INTERFACE:...>
生成器表达式,我可以将目标属性设置为不同的值,具体取决于目标是在当前构建目录中导出还是全局安装。我正在编写一个自定义宏来配合我的 CMake 包和目标,并希望根据它的导出位置(在构建目录中)或安装位置使宏的行为有所不同。该宏包含在<package>-macros.cmake.in
我的<package>-config.cmake
文件中包含的 a 中,并使用配置到构建目录中configure_file
并稍后安装。我尝试在使用configure_file
命令设置的变量中使用生成器表达式,但显然它们不打算以这种方式工作。我认为我的要求并不少见,通常如何使用 CMake 完成?
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
文件中有以下摘录:
据我从FindBLAS
和FindLAPACK
模块的文档中了解到,我需要至少通知我的用户有关{BLAS,LAPACK}_LIBRARIES
和{BLAS,LAPACK}_LINKER_FLAGS
. 对于前者,我认为我已经妥善处理了这个问题。但是,对于后者,我需要使用set_target_properties
or set_property
。在两者之间,后者似乎给了我一个更清晰的解决方案,因为我可以同时使用来自Find{BLAS,LAPACK}
模块的两个变量。当我尝试使用上述解决方案构建我的库时,我得到了明显的错误:
我的问题有两个方面:
- 我应该使用
*_LINKER_FLAGS
来自模块的所有,并且, - 如果是,我应该如何将它们干净地集成到我的 CMake 项目中?
至于上面的 2.,我已经看到了一些使用的建议/答案target_link_libraries
,但我不确定这是否是选择。
感谢您的时间!
cmake - CMake find_package:它在哪里找到包?
在我的 CMake 包中,有一个对find_package
. 这成功了,太好了!但是,事实证明是错误的软件包版本。我现在想去删除那个包。但是,我不知道它在我的系统上到底在哪里,也不-config.cmake
知道 CMake 必须在某个地方找到的文件在哪里。有没有办法find_package
给我这些信息?或者至少详细地告诉我它在哪里搜索?
我虽然这可能在变量CMAKE_MODULE_PATH
中,但这对我来说是空的。所以我猜它在某个地方的默认路径中。但是 CMake 会在很多地方搜索包,而我在我记得的通常位置都没有找到它。
cmake - CMake 正在一个奇怪的位置搜索包
我一直在试图追查为什么 CMakefind_package
在我的构建中找到了错误的包。从CMake find_package:它在哪里找到包?我学会了如何让它告诉我它正在搜索的路径,以及它在哪里找到了包。但是现在我需要弄清楚为什么CMake 正在搜索某个路径,因为它出于某种原因在非默认位置进行搜索。我检查了变量
但它们是空的。变量
是非空的,但它包含的只是
所以这不是原因。
还有什么可以让 CMake 搜索一些奇怪的前缀?
确切的问题如下:find_package(yaml-cpp)
正在搜索如下:
它在最后一个路径中找到包配置文件。但那是一些其他代码的私有构建目录,所以我不知道为什么find_package
要在那里搜索。一定是某个地方的某个变量告诉它这样做,但我不知道是哪一个。我不希望搜索此路径。
c++11 - CMake & C++ - 在几个 git 子模块之间共享库的最佳方法是什么
我正在处理包含 4 个子模块的大型 C++ 项目(使用 cLion)。我编写了小型 C++ 库,它提供了从 .properties 文件中读取的能力(在 Java 中最常见..)。
“Application.properties”文件应该包括公共变量和每个项目的变量。例如; 我正在使用 Elasticsearch 数据库,所有 4 个子模块都应该知道他的地址。此外,由于我有 4 个外国项目,我需要不断维护 5 个不同的 CMakeLists 文件(主项目的 4 个子模块 1)。
我的解决方案是在主项目根目录中设置共享代码,并通过在每个项目中包含库来使用它。
- 项目和子模块的版本控制是 git。我想了想,决定也许我应该在开始写作之前检查更多评论。
怀着感激之情,科比。
cmake - 如何从工具链文件中覆盖 cmake 模块的设置?
我有一个 CMake 工具链文件,可以在 x86_64-linux 主机上为 arm-linux 进行交叉编译。在配置期间,我的工具链文件被解析并且它(正确地)找到了一个 GNU 编译器。因此它将加载GNU.cmake
(在我的情况下/usr/share/cmake-3.10/Modules/Compiler/GNU.cmake
)。我不清楚这里的包含层次结构(找不到文档。任何链接都可以使用)。然而,它似乎是这样的:
- 根
CMakeLists.txt
到project()
- 我的工具链.cmake
- 模块目录中的东西(包括
GNU.cmake
) - 将变量加载
%_INIT
到%
缓存变量 - 之后继续
project()
假设我希望这个目标仅使用 -O2 优化来构建。我将它设置在我的工具链中,因为它对于许多项目都是全局的。
但随后GNU.cmake被加载并附加“-O3”。因此我的设置被覆盖。在此之后,我只能在我的项目CMakeLists.txt
文件中覆盖它。我必须为每个项目都这样做,开发人员会错过这个!
所以,我的问题是(重复标题):如何从工具链文件中覆盖 CMake 模块的设置?
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 时,它找不到接口的标题。我真的不知道问题出在哪里...
所有建议表示赞赏。
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
找到示例中的模块?如何查看它的位置?