在Windows下使用CMake构建跨平台Linux应用程序

10
我正在使用MSVC++在Windows 32位上开发C++软件,但由于我想在每个平台上都能使用我的软件,因此我决定使用CMake作为我的生成器。
因此,我在CMake方面仍然只是一个初学者。从CMake教程中,我了解到为了跨平台编译代码,首先应该在主机平台上安装模拟目标平台的工具链。然后使用这个工具链提供的适当的目标平台C和C++编译器,CMake将能够生成makefile等。
现在,我想在Win32平台上为Linux平台(GNU/Linux)构建我的代码。我尝试使用CMake结合Cygwin,并使用gcc和g++作为编译器进行上述过程。它构建得很好,创建了makefile,在Cygwin终端中发出"make"命令时,生成的makefile也可以执行。现在我得到了一个可执行文件,希望它能在Linux平台上运行。但是在Linux上,我得到了错误:bash无法执行二进制文件。
使用command file executablename,我意识到通过上述过程制作的可执行文件是PE32类型,仅适用于Windows。
现在我的问题是:我对使用cmake的跨平台构建过程的理解是否正确?或者我应该在windows下使用另一个Linux工具链来获得Linux ELF可执行文件?您脑海中有哪些工具链可以给我想要的东西?
非常感谢。
Setareh

我不了解cmake,但qmake有针对不同平台的“构建配置文件”。也许你应该在cmake文档中搜索“目标平台”选项,或类似的内容。 - Ivan Kolmychek
1
http://metamod-p.sourceforge.net/cross-compiling.on.windows.for.linux.html - stijn
以下是我机器上qmake的mkspecs示例列表:http://pastebin.com/raw.php?i=3mMjgC9p - Ivan Kolmychek
@IvanKolmycheck 谢谢,您是否仍需要在主机平台上拥有工具链来构建不同的目标平台,或者只需在qmake中指定"构建配置文件",qmake会生成适用于目标平台的适当的makefile?我的意思是,在您的mkspecs中列出的编译器是否可以通过qmake直接使用,或者还涉及其他过程(如第三方工具链)? - Setareh
@user2470116 Qmake会自动生成工具链的Makefile,但仍需要通过您的发行版软件包管理器进行安装。 - Ivan Kolmychek
2个回答

8

如果你需要进行交叉编译,建议查看这里:cmake-toolchains(7)。然而,我建议你在Windows机器上安装Linux虚拟机(如VirtualBox),并在Linux上本地构建。这样可以加快编译速度,而且不必担心交叉编译的问题。你可以将Windows磁盘挂载到Linux虚拟机中,以便共享源代码树。相比于在Windows下运行gcc,使用Linux虚拟机编译速度更快。


现在你可以使用WSL来完成这个任务。 - Martin Braun

1
您对CMake的理解是正确的...它将根据您的文件中的规则确定如何创建您请求的构建系统(或者是当前所在平台的默认值)。 但是,如果您没有安装可以针对Linux目标的软件,那么这并不能帮助您在Windows机器上编译Linux。
要编译针对Linux的程序,您需要使用Linux编译器。 @stjin发布的链接 告诉您如何在cygwin上安装它。 然后,在终端中设置您的CMake构建:
CC=gcc-linux CXX=g++-linux cmake . [options]

这将告诉CMake定位特殊的针对Linux的编译器。希望在使用这些编译器编译后,您能够在Linux上运行。

@Stjin和SethMMorton,感谢你们的评论和链接。但是Metamod网站显然已经更改了其二进制分发方式,现在我只能从那里获得一个metamod.dll文件,并且我不知道如何使用它在Cygwin中安装Linux交叉编译器。有什么建议吗? - Setareh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接