将 CMake 与同一语言的多个编译器一起使用

Posted

技术标签:

【中文标题】将 CMake 与同一语言的多个编译器一起使用【英文标题】:Using CMake with multiple compilers for the same language 【发布时间】:2012-03-21 12:39:20 【问题描述】:

CMake 似乎相当坚定地认为,所有 C++ 源文件都应该有一个,而且只有一个 CMAKE_CXX_COMPILER。我找不到在每个目标的基础上覆盖它的方法。这使得使用内置 CMake 工具在单个 CMakeLists.txt 中混合主机和交叉编译非常困难。

所以,我的问题是:为同一种语言(即 C++)使用多个编译器的最佳方式是什么?

【问题讨论】:

【参考方案1】:

使用 CMake 是不可能做到这一点的。

CMake 只保留一组编译器属性,这些属性由 CMakeLists.txt 文件中的所有目标共享。如果要使用两个编译器,则需要运行两次 CMake。这甚至适用于例如从同一个编译器工具链构建 32 位和 64 位二进制文​​件。

解决这个问题的快速而简单的方法是使用自定义命令。但是你最终得到了基本上是美化的 shell 脚本,这可能不是你想要的。

干净的解决方案是:不要将它们放在同一个 CMakeLists.txt 中!无论如何,您无法在不同架构之间进行链接,因此无需将它们放在同一个文件中。您可以通过将 CMake 脚本的公共部分重构为单独的文件并include() 它们来减少冗余。

这里的主要缺点是您无法使用单个命令进行构建,但您可以通过使用您喜欢的脚本语言编写一个包装器来解决这个问题,该包装器负责调用不同的 CMake-makefile。

【讨论】:

似乎 add_directory(other_build_kind_folder) 也是一种可能性,而不是制作自定义包装器,因为这就是我一直在做的事情,而且它似乎有效。 :-) @cdleary 你能解释一下它是如何工作的吗? add_subdirectory(或者你真的是指add_directory?)如何让你切换工具链? 大部分是正确的,但是有一些技术可以按摩 CMake 以同时使用主机和工具链集,这些编译器由一个版本控制。请参阅this question 和answer 了解类似的场景,我已经在几个真实世界的项目中成功使用了一段时间。 @Bill 推荐 ExternalProject 的回答也是很好的建议。 @ComicSancMs 我非常不同意第 3 段背后的推理,确实你不能链接到不同的架构,但这不是拥有不同 c++ 编译器的唯一原因,例如我曾经使用 @987654323 @ 作为 clang 的包装器,ccache 也是一个编译器包装器,这两个项目都算作不同的编译器,但只有不同的工具,原则上你可以随意使用你想要的任何单独的 cpp 文件 在 VS 中,即使是使用不同编译器编译的静态库项目也可以使用一种解决方案。因为它们都是二进制兼容的。编译器有 VC、Intel、Clang。他们都使用相同的VC stl。设计为二进制兼容。【参考方案2】:

您可能想查看 ExternalProject: http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html

【讨论】:

链接现在重定向到似乎没有提及 ExternalProject 的 PDF。【参考方案3】:

扩展@Bill Hoffman 的回答: 通过使用某种模板,例如https://github.com/Sarcasm/cmake-superbuild,将您的项目构建为超级构建 这会将依赖项和您的项目配置为 ExternalProject(独立的 cmake 配置/构建/安装环境)。

【讨论】:

以上是关于将 CMake 与同一语言的多个编译器一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在子项目中忽略 CMake 编译器定义

如何将多个文件列表与 CMake 合并在一起?

使用CMake编译C/C++程序

如何编译多个 C++ 文件以将它们与 Python ctypes 一起使用?

CMAKE编译时如何自动下载第三方库并解压安装到指定目录

cmake使用教程