问题标签 [cmake-language]

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 投票
0 回答
19 浏览

cmake - 使用较旧的 LibTool 宏时,可替代 GET_TARGET_PROPERTY(... LOCATION)

我想为我正在使用 CMake 3 构建的库生成一个 libtool 文件。我发现了这个宏,它对旧版本的 CMake 有帮助:https ://gitlab.kitware.com/cmake/community/- /wikis/contrib/macros/LibtoolFile

这是适用于 CMake 2.8 的代码:

不幸的是,这对我现在不起作用,因为最新版本的 cmake 不再支持 GET_TARGET_PROPERTY(... LOCATION)。我看到有一个生成器表达式你可以使用 ($<TARGET_FILE_NAME:target_name>) 代替它,但是你可以使用生成器表达式的规则是不同的,而且我对 CMake 的经验仍然非常有限。

谁能给我提示我如何将上述宏调整为最新版本的 CMake,或者如果已经存在一个替代解决方案,可能会给我指出一个替代解决方案?

编辑:此问题已关闭,因为它与此“相同”:如何删除 CMake 中的“可能无法从目标读取位置属性”错误?

内容相似,但不一样。上面的链接问题解释了如何替换特定的代码行,而我的问题是寻求有关如何为此处找到的代码提供替代解决方案的指导:https ://gitlab.kitware.com/cmake/community/ -/wikis/contrib/macros/LibtoolFile

0 投票
1 回答
108 浏览

cmake - add_custom_command 的可选依赖项

DEPENDS如果我在 的部分中包含不存在的文件add_custom_command,则会失败。有没有办法指定依赖关系可能不存在,但如果它被创建,则应该重新运行命令?

具体来说,我使用的是 Coco/R,它要求Parser.frameScanner.frame文件存在于与语法文件相同的目录中或由命令行参数指定的目录中,并且Copyright.frame可以存在或不存在。所以我这样做:

if如果我在里面发表评论foreach,我会得到

在构建时。有了这个if,文件就生成了,但是如果我Copyright.frame稍后创建,当然构建程序不会知道它。

0 投票
0 回答
12 浏览

cmake-language - Cmake 构建进度率始终显示 84%

cmake --build 无法达到 100%,但似乎已经构建成功......有人知道为什么会这样吗?

0 投票
1 回答
469 浏览

cmake - CMake target_include_directories 相对于父目录?

如何从我可以添加lib0路径?lib1header1.h#include <header0.h>

CMakeLists.txt

lib0/CMakeLists.txt

lib0/header0.h

lib0/header0.c

lib1/CMakeLists.txt

lib1/header1.h

lib1/header1.c

main/CMakeLists.txt

main/main.c

尝试:

错误范围为:

致命错误 C1083:无法打开包含文件:'header0.h':没有这样的文件或目录

到:

目标在其 INTERFACE_INCLUDE_DIRECTORIES 中包含相对路径

还给get_target_property(LIB0_INCLUDES "lib0" INCLUDE_DIRECTORIES)了:

使用不存在的目标“lib0”调用 get_target_property()。

0 投票
0 回答
25 浏览

cmake - CMake 相对路径库通信

假设我们有一个目录,其中也有两个库,例如:

有没有办法在没有来自 libA 和 libB 的外部 CMakeLists.txt 文件的情况下,在来自 libB 的 source2 文件中存在来自 libA 中的 source1.c 文件的访问权限?
我所需要的只是如果我能以某种方式在 libA 中按顺序构建 CMakeLists.txt,当我构建项目时没有显示错误,无法从 libB 中找到文件。

我正在尝试这个,但它失败了。

0 投票
0 回答
11 浏览

cmake - 是否可以在 CMakeLists.txt 中引用额外的 .txt 文件?

我的项目有一个 CMakeLists.txt。有几行我想排除在一个新的单独的 .txt 文件中。cmake 语言中是否有将 .txt 文件作为输入的命令?(就像 \input在乳胶中)

谢谢!

0 投票
0 回答
41 浏览

cmake - 在 CMake 中添加新语言时,include_directories 不起作用

我正在尝试在 CMake 中添加一种新的类 C 语言,称为“foo”,它需要使用特定的修改编译器

我尝试了从 makefile 到 CMake 的通用规则,它在编译单个foo文件时似乎有效。

但是我发现该命令include_directories在我使用时不起作用。

在这里,我列出了我所做的更改

CMakeDetermineFOOCompiler.cmake:

CMakeFOOInformation.cmake:

CMakeFOOCompiler.cmake.in:

CMakeTestFOOCompiler.cmake:

我的 CMakeLists.txt:

当我使用 commandmake时,我收到一个警告:

然后就来了一个致命错误,显示找不到包含的头文件:</p>

似乎这include_directories不起作用,我想需要在这些.cmake文件上添加一些更改。如何include_directories为我的案子工作?

0 投票
0 回答
138 浏览

c++ - 在 cmake 中导出和打包预建库

我不会直接提出问题,而是公开我的用例以及我尝试(但失败)解决它的方式。

说我有:

  • 3 个共享库 A、B 和 C
  • A 要求 B 和 C
  • A 自带一组表头

就是这样,没有额外的信息,它是由供应商提供的,不可能有任何变化(现代化/cmake 包等)。A 应始终与 B 和 C 打包。我只需要与 A 链接,cmake 应与 B 和 C 传递链接。

现在,我想让它更“现代 cmake”友好,并且能够:

  1. 第一个用例:创建一个包含这些库并从父项目调用 add_subdirectory() 的存储库。
  2. 第一个用例:创建一个包含相关 AConfig.cmake AConfigVersion.cmake 和 ATargets.cmake 的包(比如 debian pkg .deb)。然后一个简单的 pkg 系统安装和一个 find_package() 应该可以解决问题。

做了什么:

我尝试使用 INTERFACE IMPORTED 库和 INTERFACE。

因为我想支持打包libs INTERFACE IMPORTED 不能使用(据我所知/测试你不能安装它)。

INTERFACE 在第一个用例中运行良好,使用 add_subdirectory(),找到标头,所有链接,但由于用户此时可能没有,共享库是路径,例如,他无法运行测试。

然后是使共享库可用并使 find_package() 工作所需的导出部分。我成功导出/打包了 libs ABC、A 的标头和 find_package() 所需的文件。

但是,当在客户端库 D 中,find_package(A REQUIRED) 找到 lib(没有消息,例如“找不到由“A”提供的包配置文件”)它不会创建任何我可以链接的目标。我查看了生成的 ATargets.cmake:

请注意,如果我删除 ATargets.cmake 的 add_library 中的 IMPORTED 并删除命名空间的东西,目标 A 可以在任何客户端 cmake 项目中使用 find_package 正确访问,但它可能无法正确链接,因为 A.so (和 B 和C) 未使用${_IMPORT_PREFIX}/lib/A.so. 我尝试${_IMPORT_PREFIX}/lib/在 INTERFACE_LINK_LIBRARIES 中的所有库之前添加,删除 IMPORTED 关键字和命名空间的东西,猜猜是什么,它完美地工作......现在,我该如何做到这一点而没有技巧。

AConfig.cmake.in 的内容是:

差不多就是这样,这篇文章的其余部分是实现细节。以下代码可用于解决用例 1,但导出包和 cmake 配置/目标文件不正确。

在安装生成包(由cpack生成)后的客户端lib/cmake项目中:

文档:

cmake:创建一个包含预构建库的新库目标

https://gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/Exporting-and-Importing-Targets

是否可以将导入的库添加到 target_link_libraries 来处理包含目录?

导出导入的库

https://discourse.cmake.org/t/how-to-control-import-prefix-in-exported-targets-cmake-list-file-generated-by-cmake/2291

使用正确的自动生成配置 cmake 创建可重定位包

https://discourse.cmake.org/t/exporting-packages-with-a-custom-find-module/3820/2

感谢阅读/帮助

0 投票
1 回答
43 浏览

cmake - CMake 从 CMakeLists.txt 脚本中获取缓存变量列表

我想知道是否有办法从 CMakeLists.txt 脚本中获取缓存变量列表。我的意思是,有这样的事情:

并且,在我的 CMakeLists.txt 中

有没有办法从 CMakeLists.txt 脚本本身中获取包含 MY_VAR1、MY_VAR2 和 MY_VAR3 以及所有其他缓存变量的列表 var MY_CACHE_LIST?

谢谢

0 投票
2 回答
332 浏览

cmake - “cmake_minimum_required(VERSION 3.10)”中的“VERSION”是什么

我知道以下 CMake 语句的含义:

我只是想知道这VERSION部分在语法上是什么?

这是一个未引用的论点吗?如果参数,则必须有一些其他参数选择。

但是根据here,这似乎VERSION是该cmake_minimum_required()命令的唯一选择。

如果是这样,为什么我们甚至需要明确指定这个参数?

根据此处,此命令设置变量 CMAKE_MINIMUM_REQUIRED_VERSION 这里有某种字符串连接吗?所以我可以set_minimum_required(XXX <some_value>)用来发送一个名为CMAKE_MINIMUM_REQUIRED_XXX<some_value> 的任意变量?

加 1

我刚刚尝试在以下语句中使用CMakeLists.txt

并且 cmake 抱怨说:

所以这似乎是一个争论。

但是根据这里project()命令,一个类似的VERSION字符串被指定为一个选项。好像有点不协调。

添加 2

我刚刚尝试在以下语句中使用CMakeLists.txt

并且 cmake 抱怨说:

因此,CMake 似乎依赖于VERSION正确解释“3.10”参数的部分。所以我想这VERSION也是一个选择。

既然有另一种可能的选择FATAL_ERROR,就有必要有一个VERSION选择。

所以总结一下我目前的理解:

CMake 语言的基本范式是:

CMake 命令只是根据参数和选项操作变量。

有些变量是需要操作的,有些是可选的。

  • 对于必需的,它们的值通过参数指定。(有点像位置论点)

  • 对于可选的,它们的值是通过相应选项后面的参数指定的。(有点像命名参数)

添加 3

这里开始,对于VERSIONin cmake_minimum_required()

VERSION 是此函数的特殊关键字。版本的值跟在关键字后面。

所以在这里它被称为关键字而不是选项......

添加 4

关于 CMake 的一些感受...