使用 CMake 在面向 Linux 的 Windows 下跨平台构建
Posted
技术标签:
【中文标题】使用 CMake 在面向 Linux 的 Windows 下跨平台构建【英文标题】:Cross-platform build under Windows targeting Linux using CMake 【发布时间】:2013-06-05 20:48:47 【问题描述】:我正在 Windows 32 位(使用 MSVC++)上用 C++ 开发软件,但由于我希望能够在每个平台上使用我的软件,我决定使用 CMake 作为我的构建生成器。
因此,我仍然只是 CMake 的初学者。从 CMake 教程中,我了解到为了交叉编译代码,首先应该在主机平台上安装一个模拟目标平台的工具链。然后使用此工具链提供的适当目标平台 C 和 C++ 编译器,CMake 将能够生成 makefile 等。
现在,我想在 Win32 平台上为 Linux 平台(GNU/Linux)构建我的代码。我尝试使用 CMake 结合 Cygwin 并使用 gcc 和 g++ 作为编译器来执行上述过程。它构建良好,创建了 makefile,当我在 Cygwin 终端中发出“make”时,生成的 makefile 是“made”的。现在我有了一个我希望能在 Linux 平台上运行的可执行文件。但在 Linux 上出现错误:bash 无法执行二进制文件。
使用命令文件executablename,我发现上面程序生成的可执行文件是PE32类型的,仅适用于Windows。
现在我的问题是:我对使用 cmake 的跨平台构建过程的理解是否正确?或者我应该在 windows 下使用另一个 Linux 工具链来获取 Linux ELF 可执行文件?您会想到哪些工具链可以满足我的需求?
非常感谢
塞塔雷
【问题讨论】:
我不了解 cmake,但 qmake 有针对不同平台的“构建配置文件”。也许,您应该在 cmake 文档中搜索“目标平台”选项,或类似的东西。 metamod-p.sourceforge.net/… Example list of mkspecs for qmake on my machine @IvanKolmycheck 谢谢,您是否仍然需要在您的主机平台上有一个工具链来为不同的目标平台构建,或者您是否只是在 qmake 中指定“构建配置文件”,然后 qmake 会为目标平台?我的意思是,您的 mkspecs 中列出的编译器是否可以直接通过 qmake 使用,或者是否还涉及其他一些程序(如第三方工具链)? @user2470116 Qmake 自动生成工具链的 makefile,但仍需要通过您的发行版包管理器安装。 【参考方案1】:如果你进行交叉编译,你会想看这里:cmake-toolchains(7)。但是,我建议您在 Windows 机器上安装类似虚拟机的 Linux VM,并在 Linux 上天真地构建。它将编译得更快,您不必担心交叉编译。您可以从 linux VM 挂载 Windows 磁盘,以便共享相同的源代码树。 linux VM 的编译速度将比在 windows 下运行的 gcc 快得多。
【讨论】:
非常感谢您的回答。现在我明白了我的选择。 现在你会使用WSL。【参考方案2】:您对 CMake 的理解是正确的...它将根据您的 CMakeLists.txt
文件中的规则确定如何创建您请求的构建系统(或您当前所在平台的默认构建系统)。但是,如果您没有安装可以针对 linux 的东西,这不一定能帮助您在 windows 机器上为 linux 编译。
要针对 linux 进行编译,您需要使用 linux 编译器。 link posted by @stjin 告诉你如何在 cygwin 上安装一个。然后,要设置您的 CMake 构建,请在终端中执行此操作:
CC=gcc-linux CXX=g++-linux cmake . [options]
这将告诉 CMake 定位特殊的 linux 目标编译器。希望在使用这些编译器编译后,您将能够在 linux 上运行。
【讨论】:
@Stjin 和 SethMMorton,感谢您的 cmets 和链接。但是 metamod 网站显然已经改变了它的二进制发行版,现在我只从那里得到一个 metamod.dll 文件,而且我不知道如何在 Cygwin 中安装 Linux 交叉编译器。有什么想法吗?以上是关于使用 CMake 在面向 Linux 的 Windows 下跨平台构建的主要内容,如果未能解决你的问题,请参考以下文章