10

我参与了针对 Windows 和 Linux (RHEL) 平台的 C++ 项目。到目前为止,开发完全是在 Visual Studio 2008 上完成的。对于 Linux 编译,我们使用了第 3 方 Visual Studio 插件,它读取 VS 解决方案/perojects 文件并在 Linux 机器上远程编译。

最近决定放弃 3rd 方插件。

现在我最关心的是构建系统。我一直在寻找跨平台构建工具。这样我就不需要维护两组构建文件(例如 vcproj/solution for Windows 和 make files for Linux)。

我找到了以下候选人:斯康 B. 制作

您如何看待跨平台开发的工具?

还有一点让我感到困扰的是,如果没有 vcproj 文件,Visual Studio(+ Visual Assist)会失去很多功能——你如何使用这些工具来处理这个问题?

谢谢迪玛

PS 1:我喜欢 Scons 的一点是它(a)使用 python,因此它很灵活,而 cmake 使用专有语言(我知道它不是构建系统的赢家功能)(b)自包含(不需要在 Linux 上生成 makefile,就像使用 cmake 一样)。

那么为什么不是斯康斯呢?为什么在您的项目中决定使用 cmake?

4

6 回答 6

10

CMake 将允许您仍然使用 Visual Studio 解决方案和项目文件。Cmake 本身并不构建源代码,而是为您生成构建文件。对于 Linux,这可以是 Code::Blocks、KDevelop 或普通的 makefile 或其他更深奥的选择。对于 Windows,它可以是其他 Visual Studio 项目文件,还有其他的 MacOS。因此,Visual Studio 解决方案和项目是从您的 CMakeLists.txt 创建的。这适用于大项目就好了。例如,当前的 Ogre3d 在所有平台(Windows、Linux、MacOS 和 iPhone)上都使用 CMake,而且效果非常好。

不过,在这方面我对 scons 了解不多,我只曾经构建一个库并且只在 Linux 中构建。所以我不能在公平的基础上比较这两者。但是对于我们的多平台项目,CMake 已经足够强大了。

于 2009-07-09T23:19:53.377 回答
3

另一种选择是预制。就像 cmake 一样,它从定义文件生成解决方案。它是开源的,最新版本可以使用 Lua 脚本进行高度定制。我们能够毫不费力地添加自定义平台支持。对于您的情况,它支持 Visual Studio 和 GNU makefile 标准。

参见Premake 4.0 主页

CruiseControl 是持续集成的不错选择。我们成功地使用 Mono 在 Linux 上运行它。

于 2009-07-10T02:57:59.257 回答
3

我以前没有使用过 Scons,所以不能说它是如何工作的,但 CMake 工作得很好。

它通过生成目标平台所需的构建文件来工作。

当用于面向 VC++ 时,它会从 VS 生成解决方案和项目文件,看起来好像它们是原生 VS 项目。当然,唯一的区别是,如果您直接通过 VS 编辑项目或解决方案,则下次运行 CMake 时更改将被删除,因为它会覆盖您的项目/解决方案文件。

因此,必须改为对 CMake 文件进行任何更改。

于 2009-07-09T23:20:31.270 回答
3

我们有大量的核心库和基于这些库的应用程序。我们为每个项目或库使用 Visual Studio 解决方案在 Linux 和 Windows 上维护基于 Makefile 的构建系统。

我们发现它可以很好地满足我们的需求,每个库或应用程序都是在 linux 或 windows 上开发的,并考虑了交叉编译(例如,不要使用特定于平台的 api)。我们将 boost 用于文件路径、线程等。在特定情况下,我们使用模板/#defines 来选择特定于平台的解决方案(例如事件)。准备就绪后,我们移至其他系统(linux 或 windows),重新编译,修复警告/错误并进行测试。

我们没有花时间找出可以在两个平台上交叉编译的工具,而是使用最适合每个平台的系统,并花时间修复特定问题并使软件变得更好。

我们仅在 Windows atm 上有 GUI 应用程序。所以没有交叉编译的GUI。我们在 Windows 和 Linux 之间共享的大部分开发是服务器端网络(套接字、TCP/IP、UDP ...),然后是 Linux 上的客户端工具和 Windows 上的 GUI 应用程序。

使用 perforce 进行源代码版本管理,我们发现在很多情况下 Linux Makefile 系统比 Windows VS 更灵活地满足我们的需求。特别是对于使用多个工作区(源代码版本的视图),我们需要指向公共目录等。在 Linux 上,这可以通过自动运行脚本来更新环境变量来完成,在 Visual Studio 上引用环境变量非常不灵活,因为很难在视图/分支之间自动更新。

重新同步问题:

我假设您在问如何确保两个构建系统在 linux 和 windows 之间同步。我们实际上在 Linux 上使用 Hudson,在 Windows 上使用 CruiseControl(我们首先在 Windows 上使用巡航控制,当我去设置 linux 版本时,我认为 Hudson 更好,所以现在我们有了混合环境)。我们的系统一直在运行。当某些东西被更新时,它会被测试和发布(无论是 windows 还是 linux 版本),所以你会马上知道它是否不起作用。在测试期间,我们确保所有最新功能都在那里并且功能齐全。我想就是这样,不涉及黑魔法。

哦,你的意思是构建脚本......每个应用程序都有自己的解决方案,在解决方案中设置依赖项。在 Linux 方面,我为每个项目都有一个 makefile,并且在项目目录中有一个构建脚本来处理所有依赖项,这主要意味着构建核心库和给定应用程序所需的几个特定框架。正如您所看到的,这对于每个平台都是不同的,很容易添加行来构建脚本来更改目录并制作所需的项目。

它有助于以一致的方式设置项目。

在 Windows 上,您打开项目并添加依赖项项目。再次没有涉及魔法。我认为这类任务与开发相关,例如您向项目添加了新功能并且必须链接到框架和标题中。因此,从我的角度来看,没有理由将这些自动化 - 因为它们是开发人员在实现功能时所做的一部分。

于 2009-07-10T00:31:24.417 回答
1

这是一篇关于 KDE 开发人员决定选择 CMake 而不是 SCons 的文章。但是我必须指出,这篇文章已经快三年了,所以 scons 应该有所改进。

是 SCons 与其他构建工具的比较。

于 2009-07-10T02:32:05.073 回答
0

过去不得不这样做很多。我们所做的是将 gnu make 用于几乎所有东西,有时包括 windows。

如果您愿意,可以使用 windows 下的项目文件并使用 gnu make for Linux。

编写跨平台 makefile 并没有真正的好方法,因为目标文件在其他方面会有所不同(以及路径名问题,\ vs / 等)。通常,您可能会在各种平台上调整代码以考虑细微的差异,因此无论如何都必须对 make 文件进行调整并检查其他平台。

许多 OS 项目为不同平台维护 Makefile,例如 zlib,其中它们被命名为 Makefile.win、Makefile.linux 等。你可以跟随他们的领导。

于 2009-07-09T23:25:33.583 回答