问题标签 [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.
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
cmake - 如果工具链前缀后没有破折号,如何让 CMake 检测 ar 和 nm?
我正在为 Texas Instruments 的基于 LLVM/Clang 的新编译器开发 CMake 工具链文件(请参阅ARM-CGT-CLANG-1)。
CMAKE_C_COMPILER
如果我简单地设置为二进制文件的正确路径,CMake 会正确检测到它是基于 clang 的编译器tiarmclang
。不幸的是,我注意到它没有正确设置CMAKE_AR
,CMAKE_NM
和。CMAKE_READELF
CMAKE_STRIP
我已经浏览了 CMake 中包含的一些模块,包括CMakeDetermineCCompiler和CMakeFindBinUtils。我从中得到的是,CMakeDetermineCCompiler确定_CMAKE_TOOLCHAIN_PREFIX
使用正则表达式,该正则表达式需要在编译器名称-
前面加上破折号 ( ) 。稍后在CMakeFindBinUtilsclang
中使用它作为工具名称的前缀。_CMAKE_TOOLCHAIN_PREFIX
不幸的是,TI 决定不在名称中包含破折号,我认为这是 CMake 无法检测到 bin utils 的根本原因。我尝试_CMAKE_TOOLCHAIN_PREFIX
从工具链文件中设置,但这不起作用(它在CMakeDetermineCCompiler模块中被覆盖)。
尽管前缀很奇怪,有没有办法让 CMake 自动找到工具?还是从工具链文件中手动为每个 binutil 设置变量是唯一的解决方法(我目前正在这样做)?
cmake - cocos2d/cmake/Modules/CocosConfigDepend.cmake:94 (endmacro) 的 CMake 错误:流控制语句未正确嵌套
嘿,我是新手 cocos 2d x 开发人员,我只是想在 XCode for iOS 中创建一个“Hello World”项目。从终端我使用命令
我不断收到这两个错误,并且没有生成 xcode 项目文件。
我究竟做错了什么?
见附件截图[1]:https ://i.stack.imgur.com/cIiNC.jpg
系统规格:
cmake - 有条件地运行 CMake 的 CHECK_TYPE_SIZE
有没有办法有条件地运行 CMake 的CHECK_TYPE_SIZE
命令? CHECK_TYPE_SIZE
非常适合确定结构的大小,但问题是随着时间的推移,有人可能会使用结构修改头文件以添加新字段。当有人更新结构但忘记(或不知道)吹走CMake缓存时,这似乎是一场等待发生的事故。是的,如果更新,您可以在结构旁边放一个注释来执行缓存擦除,但是当您有一个多人项目并且其他人更新了头文件时,这并没有真正的帮助。
我试图做一个,unset(HAS_MYVAR CACHE)
但这似乎不起作用,因为该函数似乎没有重新运行。有任何想法吗?
代码:
cmake - librsvg - cmake 模块调试模式附加一个后缀
我正在尝试让我们依赖的原生 Windows 构建工作librsvg-2
。它已通过vcpkg正确安装。我们通常使用 cmake 构建并制作了一个自定义模块来找到这个库。这在 unix 世界中非常有效,但不适用于 Windows 并且针对 Debug 构建或 Release 构建(来自 Visual Studio)。d
这是因为实际的 lib 文件在 Windows 上以 a 为后缀。
这是我们的FindLibRSVG.cmake
为了让构建在 Windows 上运行,我必须为我们的 cmake 命令指定一个标志,如下所示:
请注意d
图书馆末尾的 。
我知道有一个SelectLibraryConfigurations
可用的 cmake 模块,但我不太确定如何正确使用它。
我想要实现的是能够在调试模式下构建而无需提供此标志。
cmake - 如何在 cmake 中构建相互查找的命名空间子项目
我正在尝试让一个基本的 cmake 项目与 2 个子项目(每个都是一个库)一起工作,其中一个依赖于另一个。
因此,我有一个针对 lib1 的独立项目和一个针对 lib2 的独立项目(但这取决于 lib1)。一些 lib2 作者可以,而其他人无法访问 lib1 源代码。如果不需要访问,似乎一个接一个地构建和安装是要走的路。有没有办法使用 cmake 一次性构建它们?目前,我正在尝试使用一个整体项目,libs。
但是,由于这些库是相关的,我想以类似 boost / poco 的方式称呼它们。那是我想写的lib2:
我已经为 lib1 和 lib2 以及 libs 创建了配置文件。但是,我不断收到相同的错误
我不明白将这些文件放在哪里。它在前缀/等下搜索它们,但在构建这些库时尚未安装。放置 -config.cmake 文件的正确位置是什么?我已经把它们都放进去了
这似乎与 Poco 相似,但错误仍然存在。图书馆如何找到彼此?
// 更新:
从评论中我了解到,首先需要构建 lib1 才能使用 find_package。有没有办法(在cmake中)
- 构建 lib1,安装它,构建 lib2
- 还是使用 bash / python / etc 脚本更好?
c++ - 在 cmake 中导出和打包预建库
我不会直接提出问题,而是公开我的用例以及我尝试(但失败)解决它的方式。
说我有:
- 3 个共享库 A、B 和 C
- A 要求 B 和 C
- A 自带一组表头
就是这样,没有额外的信息,它是由供应商提供的,不可能有任何变化(现代化/cmake 包等)。A 应始终与 B 和 C 打包。我只需要与 A 链接,cmake 应与 B 和 C 传递链接。
现在,我想让它更“现代 cmake”友好,并且能够:
- 第一个用例:创建一个包含这些库并从父项目调用 add_subdirectory() 的存储库。
- 第一个用例:创建一个包含相关 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项目中:
文档:
https://gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/Exporting-and-Importing-Targets
是否可以将导入的库添加到 target_link_libraries 来处理包含目录?
https://discourse.cmake.org/t/exporting-packages-with-a-custom-find-module/3820/2
感谢阅读/帮助
c++ - 如何在 CMake 3.15 中为 clang++/gcc 创建和使用预编译头文件
在我的项目中,有一些几乎在所有文件中都使用的标题。因此,为了提高构建速度,我决定使用预编译头文件。我正在使用 CMake 3.15 和 clang++。在 CMake 3.16 中,我们可以使用 target_precompile_headers()。但在 3.15 中它不可用。
我将尝试在这里解释一个示例。我有常见的标题,例如engine.h、wheel.h、door.h。这些文件存储在 my_proj/includes/ 目录中。这些标题包含在我所有的子项目中。
我想知道如何制作和使用它们作为 cmake 3.15 中的预编译头文件。
cmake - 在 CMake 中一次编译和链接库
我是 CMake 环境的新手。我有这个项目结构树:
其中my_dep是一个 git 子模块,用作my_proj项目的依赖项。
通常我分别编译这两个实体,首先编译库my_dep,然后将其链接到my_proj exe。
现在我希望能够使用单个 CMake 命令编译这两个库而不是可执行文件一次。
/my_proj/CMakeList.txt文件必须包含所有需要的命令,以首先编译my_dep lib 并生成.a/.so 文件,然后编译my_proj exe并最终将 lib 与 exe 链接。
我想一次性完成这个过程,只需要一个 make 命令,例如
你能给我一个关于使它成为可能的简单解释吗?
c++ - 在多个项目之间共享 CMake 脚本
我正在寻找一种在多个项目之间共享 CMake 脚本的方法。
在一个名为somelib
我的存储库中,我有一个cmake
文件夹,并且我想从其他项目中将脚本包含在其中。在我的文件夹CMakeLists.txt
中somelib
包含许多文件cmake
。
我的项目将“somelib”声明为外部依赖项,如下所示:
我不确定这是一个好的做法,所以请随时纠正我,但我愿意包含CMakeLists.txt
of,somelib
以便我的项目包含所有包含的文件somelib
。
所以在FetchContent_MakeAvailable
我做了之后:
这包括本身工作得很好,但问题在于CMakeLists.txt
. somelib
实际上,它所包含的内容与其位置无关,从而导致如下错误:
我确实意识到,CMakeLists.txt
我可以简单地做,而不是包括:
但随着时间的推移,这将变得相当大(而且它会在我的所有项目之间重复),所以我希望有一个单一的入口点,我可以包含一个单一的东西,以便在我的 CMakeLists 中拥有手头的所有东西。可能吗 ?