问题标签 [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 回答
201 浏览

cmake - KitWare 的在 CMake 中查找库的指南中弃用了哪些内容?

我需要编写一个 CMake FindXYZ 类型的模块。谷歌搜索,我找到了这个指南:

https://cmake.org/Wiki/CMake:How_To_Find_Libraries

来自 Kitware,但有一个关于它被弃用的免责声明。在过去,比如 6 到 7 年,这些模块的编写方式发生了哪些重大变化(如果有的话)?

0 投票
0 回答
679 浏览

module - 如何在现有库的上下文中使用“现代”CMake 导出目标

我正在更新一个(非常旧的)库的查找模块。所以情况是一个现有的共享库,它使用 CMake 本身。用户可能已经将它安装在某个地方,在包 repos 或其他地方。

现在他们想用这个。好的方法是

所以这就是目标。

问题是:一个好的 find_package-Config 或 -Module 看起来如何允许这个 2-liner 工作?它应该满足这两个要求:

  • 允许 CMake 版本使用比用于构建它的库更旧的库
  • 强制执行例如 C++11 模式。在 Find-Module 中,可以根据版本(cxx_std_11(CMake 3.8+)、cxx_alias_templates(CMake 3.1+),check_cxx_source_compiles使用 C++11 代码和对旧 CMake 的警告)设置 C++11 要求

有两种方法可以做到这一点:

  1. 更新 find-module 以定义一个导入的库Foo::Foo并正确设置它(使用属性)并且很高兴也为旧的 CMake w/o 目标设置FOO_INCLUDE_DIR和设置。 这很简单:只需使用and ,设置导入的目标即可。向前和向后兼容,因此即使是旧版本也能找到。FOO_LIBRARIES
    find_pathfind_library

用法:
用户将其项目复制(最新)FindFoo.cmake到 egcmake/Modules并指向CMAKE_MODULE_PATH它,或复制FindFoo.cmake到某些 CMake 默认路径。

  1. Daniel PfeifferModern CMakeIf you are the library author, don't make a Find<mypackage>.cmake script!所以我们导出和安装目标。
    这有点乱。需要进行以下更改:

    • Add EXPORTS FooTargetsand INCLUDES DESTINATION includeto install(TARGETS(参见 Pfeiffer #24),它基本上只是定义了一个导出。(我真的不明白,为什么我要为已经有名字的东西创建一个额外的名字。为什么下面的命令不能简单地引用一个目标?)
    • 添加install(EXPORT FooTargets NAMESPACE Foo:: DESTINATION lib/cmake/Foo)它会创建一个FooTargets.cmakein<CMAKE_INSTALL_PREFIX>/lib/cmake/Foo定义一个Foo::Foo具有(希望)其所有依赖项的目标
    • 根据我的理解,FooConfigVersion.cmake可能通过使用它来添加“某物” ,将版本硬编码到该文件write_basic_package_version_file
    • 创建一个FooConfig.cmake可用于find_dependency搜索 Foo 依赖并包含的库的FooTargets.cmake
    • 安装FooConfig.cmakeFooConfigVersion.cmake_lib/cmake/Foo
    • 修改target_include_directories为使用单独的BUILD_INTERFACEINSTALL_INTERFACE路径

用法:
find_package自动查找FooConfig.cmakeFooConfigVersion.cmake何时Foo搜索。

所以应该首选配置模块,但我看到的问题是:

  • 过程看起来更复杂
  • 它不能用于使用户能够找到旧版本的库(没有使用这种方法)
  • 它不包括所有使用旧 CMake 的(库)用户(2.8.11 可能是这里所需的最低要求)
  • 它需要更新的 CMake 版本来构建库本身
  • C++11 的要求似乎很难编码

那么我们可以用 CMake-Config 解决需求吗?答案应该提供一个解决方案,或者至少是一个有充分根据的“不可能”。它还应该解决最后概述的问题。

最后说明:如果它不存在,我想这是一个很好的 wiki 条目。

0 投票
1 回答
651 浏览

cmake - 仅将导入模块的标头添加到 CMake 中的库中

在 CMake 中,有一些导入的模块用于简单地将外部模块添加到本地目标。例如,如果我们想boost::filesystem在我们的项目中使用库,我们可以有CMakeLists.txt这样的:

通过上述配置,CMake 将添加适当的编译器选项,并在所需库中包含目录来构建foo.

现在我们必须构建一个库而不是可执行文件,并且我们不想将boost::filesystem库链接到我们的库。我们只希望将编译器选项和包含目录添加到我们的目标中。我们可以在这里使用导入模块的概念吗?我的意思是,如果我们可以使用Boost::filesystem语法将这些选项添加到我们的目标?

0 投票
1 回答
57 浏览

c++ - 使特定于 Unix 的 CMake 过程跨平台

我已经写了一个小的 CMake 模块,好吧,不管做什么。关键是它的作用如下:

  • 当调用适当的 CMake 函数时,将调用具有相对路径scripts/whatever.sh(在项目目录下)的 shell 脚本。
  • 包含 CMake 找到的 C 编译器的 C 程序的 shell 脚本cat'sa 'here-file'(回退到cc
  • 程序被编译、链接和运行,产生一些文本
  • 输出文本保存为 CMake 变量

这在类 Unix 系统上相对健壮,在哪里catbash可用以及路径分隔符何时为/. (我可能忽略了其他假设。)但是 - 我希望它也能在 Windows 和其他系统上工作。我该怎么做呢?

笔记:

0 投票
0 回答
927 浏览

python - Python C 扩展:致命 Python 错误:PyThreadState_Get:没有当前线程

我正在尝试构建一个使用 ffmpeg 库的基于 C 的 Python 扩展。由于有一堆库我必须导入。我使用了 CMake。我按照python doc的说明进行操作

使用 CMake 构建运行良好,没有任何问题。但是当我导入库时,我得到以下异常。

我正在使用带有 python2.7.14 的 mac(使用 Brew 安装)。

以下是我的

CMakeLists.txt

即使是像下面这样的简单程序也会失败

非常感谢您为解决此问题提供的任何帮助。

0 投票
1 回答
2381 浏览

c++ - 如何为使用 CMAKE 的交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?

我正在尝试使用 CMake 3.12.0 版本设置用于交叉编译的工具链文件。

我的目标文件具有与.objWindows 和.oUNIX 不同的扩展名。

因此,我将我的设置CMAKE_LANG_OUTPUT_EXTENSION.src.

CMakeCInformation.cmake不幸的是,这个变量在这些行中被文件覆盖:

如果我评论这些行,我的配置将起作用,并且将使用正确的对象扩展名。

我认为我的工具链文件已配置为 CMake 不会执行其内部编译器检查。

这是我的工具链文件输入行的外观:

我知道CMakeForceCompiler是折旧的,CMAKE_TRY_COMPILE_TARGET_TYPE应该使用,这就是为什么两者都在那里。

我告诉 CMake 我的工具链文件使用-DCMAKE_TOOLCHAIN_FILE

你能帮我弄清楚我做错了什么吗?

编辑:我也在尝试CACHE. CMAKE_C_OUTPUT_EXTENSION至少对我来说这不起作用。

0 投票
2 回答
983 浏览

c++ - Cmake FindBoost.cmake MinGW-W64:搜索名称不正确的库

我已经构建了 Boost 1.68(使用https://gist.github.com/sim642/29caef3cc8afaa273ce6的说明,并添加link=static,shared到 b2 命令行以构建共享库。)

这些库似乎可以正确构建,并且我已经正确设置了BOOST_INCLUDEDIRBOOST_LIBRARYDIR环境变量。

但是,当我将以下内容添加到 a 时CMakeLists.txt

并生成MinGW Makefiles,我收到以下错误:

我已将添加的输出放在set(Boost_DEBUG ON)此处find_packagehttps ://pastebin.com/yRd5DPt4

根据调试输出,查找脚本正在正确的目录 ( c:\boost\install\lib) 中搜索,但没有找到 boost 库,因为它们具有不同的命名方案。例如,system库名为libboost_system-mgw81-mt-x64-1_68.dll,但查找脚本将库名称传递boost_system-mgw81-mt-1_68给 CMake 的find_library. 请注意,寻址模型 ( -x64) 未列在后一个名称中。

我的问题是这是否是 Boost 或 findCMake 脚本的问题?这可以通过在 findCMake 脚本之前设置特定的 cmake 变量来解决吗?

0 投票
1 回答
347 浏览

unit-testing - 测试我们的 CMake 模块

我们为 CMake 创建了多个附加功能。它们变得很多,我们需要(单元)测试它们。

有一些简单的,只有可变的基础,例如:

这些可以使用自定义 CMake 脚本进行测试,以检查结果。为此,我们还编写了一组断言宏。

当函数基于目标时,这变得更加困难:

我们需要一个需要配置的多个 CMakeLists.txt 文件。配置必须成功或失败并显示指定消息。还必须检查结果文件。

我想知道,有没有更简单的方法?有现成的框架吗?Kitware 如何测试出厂的模块?

0 投票
1 回答
917 浏览

cmake - 如何在 Yocto 的正确位置部署 Autotools 库的 Find*.cmake 文件?

我为我的公司项目在现有的 Yocto git 上创建了一个新层。

在这一层中,我添加了一些基于外部autotools的库。一些应用程序需要链接到这个库,并且应用程序项目都是cmake基于的。

使用其中一个库(例如libcoap),我可以轻松找到一些FindCoAP.cmake添加到我的库配方中。

现在,如果我在 PC 上运行,只需将此FindCoAP.cmake文件放在cmake's${CMAKE_ROOT}/Modules目录中,但我应该如何bitbake配方(do_install 挂钩)中继续使我的Find*.cmake模块可用于任何人的依赖项目?

我应该尝试从这样的系统信息中获取Yocto'cmake CMAKE_ROOT变量还是一种更安全、更可靠的方法?

提前致谢。

0 投票
0 回答
54 浏览

cmake - 使用 Hunter 包含 pybind11 cmake 文件

我正在使用 Hunter 来管理我的项目的依赖项。其中之一是pybind11 它已正确安装,我可以在我的代码中使用它。但是,当使用 CMake 构建我的项目时,我需要使用一些pybind11cmake 文件中提供的一些 cmake 函数。这些位于pybind11_DIR 如何包含它们?

在我习惯于这样做之前只add_subdirectory(pybind11)包含所有内容。

谢谢