问题标签 [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 - KitWare 的在 CMake 中查找库的指南中弃用了哪些内容?
我需要编写一个 CMake FindXYZ 类型的模块。谷歌搜索,我找到了这个指南:
https://cmake.org/Wiki/CMake:How_To_Find_Libraries
来自 Kitware,但有一个关于它被弃用的免责声明。在过去,比如 6 到 7 年,这些模块的编写方式发生了哪些重大变化(如果有的话)?
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 要求
有两种方法可以做到这一点:
- 更新 find-module 以定义一个导入的库
Foo::Foo
并正确设置它(使用属性)并且很高兴也为旧的 CMake w/o 目标设置FOO_INCLUDE_DIR
和设置。 这很简单:只需使用and ,设置导入的目标即可。向前和向后兼容,因此即使是旧版本也能找到。FOO_LIBRARIES
find_path
find_library
用法:
用户将其项目复制(最新)FindFoo.cmake
到 egcmake/Modules
并指向CMAKE_MODULE_PATH
它,或复制FindFoo.cmake
到某些 CMake 默认路径。
听Daniel Pfeiffer和Modern CMake说
If you are the library author, don't make a Find<mypackage>.cmake script!
所以我们导出和安装目标。
这有点乱。需要进行以下更改:- Add
EXPORTS FooTargets
andINCLUDES DESTINATION include
toinstall(TARGETS
(参见 Pfeiffer #24),它基本上只是定义了一个导出。(我真的不明白,为什么我要为已经有名字的东西创建一个额外的名字。为什么下面的命令不能简单地引用一个目标?) - 添加
install(EXPORT FooTargets NAMESPACE Foo:: DESTINATION lib/cmake/Foo)
它会创建一个FooTargets.cmake
in<CMAKE_INSTALL_PREFIX>/lib/cmake/Foo
定义一个Foo::Foo
具有(希望)其所有依赖项的目标 - 根据我的理解,
FooConfigVersion.cmake
可能通过使用它来添加“某物” ,将版本硬编码到该文件write_basic_package_version_file
- 创建一个
FooConfig.cmake
可用于find_dependency
搜索 Foo 依赖并包含的库的FooTargets.cmake
- 安装
FooConfig.cmake
和FooConfigVersion.cmake
_lib/cmake/Foo
- 修改
target_include_directories
为使用单独的BUILD_INTERFACE
和INSTALL_INTERFACE
路径
- Add
用法:
find_package
自动查找FooConfig.cmake
和FooConfigVersion.cmake
何时Foo
搜索。
所以应该首选配置模块,但我看到的问题是:
- 过程看起来更复杂
- 它不能用于使用户能够找到旧版本的库(没有使用这种方法)
- 它不包括所有使用旧 CMake 的(库)用户(2.8.11 可能是这里所需的最低要求)
- 它需要更新的 CMake 版本来构建库本身
- C++11 的要求似乎很难编码
那么我们可以用 CMake-Config 解决需求吗?答案应该提供一个解决方案,或者至少是一个有充分根据的“不可能”。它还应该解决最后概述的问题。
最后说明:如果它不存在,我想这是一个很好的 wiki 条目。
cmake - 仅将导入模块的标头添加到 CMake 中的库中
在 CMake 中,有一些导入的模块用于简单地将外部模块添加到本地目标。例如,如果我们想boost::filesystem
在我们的项目中使用库,我们可以有CMakeLists.txt
这样的:
通过上述配置,CMake 将添加适当的编译器选项,并在所需库中包含目录来构建foo
.
现在我们必须构建一个库而不是可执行文件,并且我们不想将boost::filesystem
库链接到我们的库。我们只希望将编译器选项和包含目录添加到我们的目标中。我们可以在这里使用导入模块的概念吗?我的意思是,如果我们可以使用Boost::filesystem
语法将这些选项添加到我们的目标?
c++ - 使特定于 Unix 的 CMake 过程跨平台
我已经写了一个小的 CMake 模块,好吧,不管做什么。关键是它的作用如下:
- 当调用适当的 CMake 函数时,将调用具有相对路径
scripts/whatever.sh
(在项目目录下)的 shell 脚本。 - 包含 CMake 找到的 C 编译器的 C 程序的 shell 脚本
cat
'sa 'here-file'(回退到cc
) - 程序被编译、链接和运行,产生一些文本
- 输出文本保存为 CMake 变量
这在类 Unix 系统上相对健壮,在哪里cat
和bash
可用以及路径分隔符何时为/
. (我可能忽略了其他假设。)但是 - 我希望它也能在 Windows 和其他系统上工作。我该怎么做呢?
笔记:
python - Python C 扩展:致命 Python 错误:PyThreadState_Get:没有当前线程
我正在尝试构建一个使用 ffmpeg 库的基于 C 的 Python 扩展。由于有一堆库我必须导入。我使用了 CMake。我按照python doc的说明进行操作
使用 CMake 构建运行良好,没有任何问题。但是当我导入库时,我得到以下异常。
我正在使用带有 python2.7.14 的 mac(使用 Brew 安装)。
以下是我的
CMakeLists.txt
即使是像下面这样的简单程序也会失败
非常感谢您为解决此问题提供的任何帮助。
c++ - 如何为使用 CMAKE 的交叉编译配置设置特定的 CMAKE_C_OUTPUT_EXTENSION?
我正在尝试使用 CMake 3.12.0 版本设置用于交叉编译的工具链文件。
我的目标文件具有与.obj
Windows 和.o
UNIX 不同的扩展名。
因此,我将我的设置CMAKE_LANG_OUTPUT_EXTENSION
为.src
.
CMakeCInformation.cmake
不幸的是,这个变量在这些行中被文件覆盖:
如果我评论这些行,我的配置将起作用,并且将使用正确的对象扩展名。
我认为我的工具链文件已配置为 CMake 不会执行其内部编译器检查。
这是我的工具链文件输入行的外观:
我知道CMakeForceCompiler
是折旧的,CMAKE_TRY_COMPILE_TARGET_TYPE
应该使用,这就是为什么两者都在那里。
我告诉 CMake 我的工具链文件使用-DCMAKE_TOOLCHAIN_FILE
你能帮我弄清楚我做错了什么吗?
编辑:我也在尝试CACHE
. CMAKE_C_OUTPUT_EXTENSION
至少对我来说这不起作用。
c++ - Cmake FindBoost.cmake MinGW-W64:搜索名称不正确的库
我已经构建了 Boost 1.68(使用https://gist.github.com/sim642/29caef3cc8afaa273ce6的说明,并添加link=static,shared
到 b2 命令行以构建共享库。)
这些库似乎可以正确构建,并且我已经正确设置了BOOST_INCLUDEDIR
和BOOST_LIBRARYDIR
环境变量。
但是,当我将以下内容添加到 a 时CMakeLists.txt
:
并生成MinGW Makefiles
,我收到以下错误:
我已将添加的输出放在set(Boost_DEBUG ON)
此处find_package
:https ://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 变量来解决吗?
unit-testing - 测试我们的 CMake 模块
我们为 CMake 创建了多个附加功能。它们变得很多,我们需要(单元)测试它们。
有一些简单的,只有可变的基础,例如:
这些可以使用自定义 CMake 脚本进行测试,以检查结果。为此,我们还编写了一组断言宏。
当函数基于目标时,这变得更加困难:
我们需要一个需要配置的多个 CMakeLists.txt 文件。配置必须成功或失败并显示指定消息。还必须检查结果文件。
我想知道,有没有更简单的方法?有现成的框架吗?Kitware 如何测试出厂的模块?
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
变量还是一种更安全、更可靠的方法?
提前致谢。
cmake - 使用 Hunter 包含 pybind11 cmake 文件
我正在使用 Hunter 来管理我的项目的依赖项。其中之一是pybind11
它已正确安装,我可以在我的代码中使用它。但是,当使用 CMake 构建我的项目时,我需要使用一些pybind11
cmake 文件中提供的一些 cmake 函数。这些位于pybind11_DIR
如何包含它们?
在我习惯于这样做之前只add_subdirectory(pybind11)
包含所有内容。
谢谢