问题标签 [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 投票
2 回答
89 浏览

c++ - CMakeList.txt 中应包含哪些模块以进行近似最近邻搜索?

我已经编译了ANN 库,需要在 C++ 文件中使用它来进行分段评估

我已经设置了使用 ITK 和 ANN 库的 CMakeList.txt,如下所示:

但是,一旦我编译 C++ 文件,它就会引发错误:

似乎问题与链接库有关。我应该添加任何特定的行或模块CMakeList.txt吗?

0 投票
1 回答
385 浏览

cmake - CMake find_path / find_library 是否搜索_ROOT 默认?

在阅读有关 CMake 政策 74 - https://cmake.org/cmake/help/latest/policy/CMP0074.html

[...] 现在搜索由 _ROOT CMake 变量和ROOT 环境变量指定的前缀。包根以堆栈形式维护,因此对find 模块和配置包中所有 find * 命令的嵌套调用也将根作为前缀进行搜索。

这是否意味着<PackageName>_ROOT不需要find_*明确包含在路径中?这是否意味着<PackageName>_ROOT将自动检查?

0 投票
1 回答
174 浏览

cmake - 使用带有 check_c_source_runs() 或 try_run() 的接口库

用例:我正在尝试编译一个测试程序,该程序使用 SDL2_ttf(使用 SDL2、Freetype、PNG 和 Zlib)探测 TrueType(tm) 字体列表。接口库存在SDL2_ttf::SDL2_ttf并与目标可执行文件成功链接。我的问题是如何获取check_c_source_runs()定义,包括目录和库。我宁愿不必手动从属性中提取所有内容,如以下代码片段所示:

链接库很麻烦,因为有从内部引用的接口库SDL2_ttf::SDL2_ttf,例如FreeType::FreeType.

建议?

0 投票
1 回答
1657 浏览

c++ - Modern CMake 3 with QT5 "Qt5::QtCore" 但找不到目标

我在使用 CMake 和一个简单的 QT 示例时遇到问题。我正在更新我的 CMake 配置以遵循现代方式,这意味着支持 CMake > v3.0。

这是我的 CMakeLists.txt

我的代码示例(main.cpp)

但是当我运行 CMake 时,出现以下错误:

我不明白我错过了什么。我遵循了cmake 文档示例

谢谢你的帮助,

编辑 1:感谢我修复错字问题的评论。而Qt5::Core不是Qt5::QTCore. 但现在我得到了这个构建问题:

0 投票
1 回答
148 浏览

cmake - 在 CMake 配置文件中查找辅助依赖项

遵循现代 CMake 指南(例如,参见https://www.slideshare.net/DanielPfeifer1/effective-cmake,尤其是幻灯片 46),我正在尝试PkgConfig.cmake为我的Pkg.

Pkg取决于Foo哪个又取决于Bar。既没有FooBar没有配置文件——而是我正在使用FindFoo.cmakeFindBar.cmake找到它们。

我的PkgConfig.cmake文件看起来像这样

我的结果PkgTargets.cmake看起来像

我的问题是如何避免其他包导入Pkg到他们的项目中,而不必指定在哪里Foo,更重要Bar的是在哪里可以找到?

如果必须通过变量和或再次指定包的位置Foo,这是否会破坏构建传递依赖项的目的?BarFoo_ROOTBar_ROOTCMAKE_PREFIX_PATH

我的 Pkg 已经知道它是在哪里找到的,所以我应该解析/设置Foo_ROOT并将Bar_ROOT其放入我的PkgConfig.cmake文件中吗?

0 投票
0 回答
60 浏览

c++ - 具有传递依赖的 findFoo.cmake

我有一个像这样组织的大型预编译 C++ 代码库:

这些项目都不是使用 cmake 构建的。

我正在编写一段用 cmake 构建的新代码,这取决于其中一些库。

我知道我的依赖项(让我们在这里假设 libA),并且每个依赖项也知道它自己的依赖项(例如,libA 依赖于 libB,libB 依赖于 libC)。请注意,没有外部依赖项。一切都在这里,在这些文件夹中。

我正在考虑编写一堆 FindProjectX.cmake 脚本,这将为每个项目创建一个 cmake 包,每个库包含一个导入的目标。我最终会得到导入的目标,如Project0::libA, Project0::libB,Project1::libC等。

这一切都很好,但我不确定如何处理我的 FindProjectX.cmake 文件中的依赖项的依赖项。我可以find_package(Project1 REQUIRED COMPONENTS libC)从 FindProject0.cmake 打电话吗?

请注意,我有很多这样的库和项目。我打算编写一个 python 脚本来自动生成这些 FindProjectX.cmake 脚本。

0 投票
0 回答
419 浏览

cmake - CMake 找不到通过 Homebrew 安装的 Open MPI

我已经使用自制软件安装了 Open-MPI,使用 brew install open-mpi。

如果我mpic++ main.cpp在命令行中运行,则代码编译正确。然后我可以使用 mpirun a.out.

现在的问题是,当我在 Clion 中创建 CMakelists.txt 文件时,似乎无法找到 Open-MPI 包:

有人可以提供指导吗?我对如何让它工作感到困惑,并且已经尝试了几个小时。我是 Open-MPI 的新手。

当我尝试构建时它产生的错误:

谢谢!

0 投票
0 回答
213 浏览

c++ - cmake CMAKE_PREFIX_PATH 不适用于 set()

我有一个外部 SDK,其中包含所有库并包含在内。

现在要让它工作,我需要设置CMAKE_PREFIX_PATH我的路径,所以我试图在 CMake 文件中设置变量,如下所示:

但由于某种原因,它没有像我预期的那样工作,因为它不会找到一些带有 function 的包pkg_check_modules

另一方面,我已经进入终端,我会像这样调用 CMake,一切都很好,这将按预期工作。

这是我的 CMake 文件的一部分:

你们中的一个人可以向我解释为什么会发生这种情况以及如何修复我的 CMake 文件以使其正常工作吗?

0 投票
0 回答
234 浏览

cmake - 在 CMake 中添加对新编译器供应商的支持(交叉编译)

我想使用Tasking TriCore工具链和 CMake(3.16 可以)交叉编译嵌入式应用程序。

我从一个完整的工具链文件开始,其中指定了二进制文件和规则的所有路径,但后来我阅读了这个线程并将Compiler/IAR*脚本用作示例(https://github.com/Kitware/CMake/blob/master/Modules/编译器)以更清洁的方式结束。

我知道在 C/CXX 项目中默认情况下,CMake 会尝试编译一个简单的测试程序CMakeCCompilerId.c来检测编译器 ID 供应商和版本。使用IAR-DetermineCompiler.cmake,我创建了自己的Tasking-DetermineCompiler.cmake,它将使用由 ctc 编译器定义的符号。但即使这个文件是由 CMake 执行的(检测到语法错误),它似乎对生成的测试源文件没有任何影响。

这意味着编译器标识的默认机制不适用于我的编译器,并且我收到消息“C 编译器标识未知”。在我的工具链文件中,我需要强制识别:

到目前为止,是可行的,但我想了解是否可以使用默认的 CMake 方式来识别编译器 ID 和版本。我找不到如何在文档中添加其他供应商!

非常感谢

0 投票
1 回答
1111 浏览

cmake - 如何确定 CMake 函数的范围,使其无法从文件外部访问?

我正在尝试在一个相对复杂的项目中编写一些 CMake 代码,并且我有一个内部包含另一个模块的模块。问题是,每当我包含我的模块时,它内部包含的模块中定义的所有功能都会在全局级别上可用!这实际上是用我没有明确要求的一堆函数污染了我的全局命名空间。

例如:

在我的模块里面:

有什么方法MyModule.cmake可以让我从中导入函数AnotherModule.cmake而不让它们在我自己的模块之外可见?这个另一个模块是由其他人编写的,所以我无法控制它,它包括其他具有非常通用名称的函数,比如一个parse_arguments可能会在以后导致命名冲突的函数。

使函数从AnotherModule.cmake外部完全不可见MyModule.cmake将是理想的,但即使有一种简单的方法来模拟一个名称空间以供导入的函数进入,这也总比没有好。