跨平台C++项目入门

7
我正在开始一个C++项目,希望能够从同一代码库编译出可以在Eclipse(Linux)和VS2010中同样运行的程序。需要一些帮助来启动项目。虽然很多方面都可以单独搜索,但我希望得到如何整体解决问题的建议。例如,在哪里存放库源代码,如何构建make文件,以及如何集成googletest(仅查找一个初学者教程就很困难)。如果您能提供一些涵盖这些方面的教程链接,或者一系列教程,将会非常感谢。我的背景是C#,我希望保持我的VS项目的“干净”和组织性。

你是指Windows上的VS2010和Linux上的Eclipse之间的兼容性吗?Eclipse本身就是一个非常多平台的IDE。 - Reinderien
是的,谢谢你的问询。Eclipse正在Linux (OpenSuse 11.3)上运行。 - ccook
3个回答

13
我曾经完成过跨平台项目,使用了两个平台上的“本地”构建系统(Windows上的vsproj文件和Linux上的makefile),但维护这两个项目文件确实很麻烦。因此,我同意其他建议,您应该尝试使用可靠的跨平台构建工具。CMake或可能是Boost build是不错的选择 - 可能还有许多其他选择。
当涉及到第三方库时,您需要坚持使用经过充分测试的跨平台库。Boost是用于c ++的最佳通用库(是的,在几乎每个c ++线程中都会提到它...但那是因为它真的是一套非常有用的东西)。至于XML、HTTP、图像库、UI等,都有很好的跨平台选项 - 只需四处寻找或在此处提出特定要求即可。无论您做什么,都不要使用来自CodeProject或其他面向MS站点的库,这些库仅在Visual Studio 6上进行过测试 - 这只会导致痛苦。大多数GNU库现在都可以在Windows上构建,因此您应该相对安全。
尽管很诱人,但请尽量减少代码中的平台#ifdefs - 最好尽可能将任何特定于平台的内容抽象到库中。
祝你好运!

关于 #ifdef 和单独的库 - 将通用代码放在一个库中的基类中,然后通过多态性扩展该类以创建不同平台特定行为的平台特定子类是合理的。然后,唯一需要的 #ifdef 是控制使用哪个子类。 - Reinderien
关于 ifdef/分离库,您还可以拥有一个共同的头文件,然后将源文件拆分为一些在共享 CPP 中的源和一些在平台特定文件中的源,这些文件仅在适当的系统上构建。 - Paul Whitehurst
这些库是开源的,我是否应该在构建过程中将其作为本地编译,并从存储库中省略二进制文件?谢谢。 - ccook
我找到了一个不错的 Boost 构建介绍:http://www.highscore.de/cpp/boostbuild/ 看起来真的很棒。 - ccook
@Mike 谢谢!我正在使用Mercurial,但我会按照你的建议在第三方库中包含版本号。 - ccook
显示剩余2条评论

5
你需要看一下 cmake

4

如果你想要跨平台并且希望一切尽可能“清洁”,我建议你集中使用现代跨平台构建工具(如Scons)来管理你的构建系统。Scons是用Python编写的,非常简洁而强大,并且可以在任何地方使用。

或者,如果你喜欢Eclipse,只需在Windows和GNU/Linux上安装Eclipse即可。正如我上面提到的,它是跨平台的,并且你可以让它为各种不同系统上的编译器工作。


看起来很有前途,但实现起来会有多难呢?我刚刚把自己搞晕了。 - ccook
3
我个人认为,Makefile 的语法非常笨拙。如果你了解其历史,你就会发现它从来不是为公共、大规模构建解决方案而设计的。它很难扩展、难以维护,并且对人类可读性很差。只需看看那些将混淆层套在混淆层上的工具(如 automake 和其类似工具)的数量即可。另一方面,Scons 就是纯 Python 语言编写的,并且有很好的文档和丰富的示例。 - Reinderien
@ccook:SCons更加自动化,而且由于你拥有完整的Python功能,可以使用glob.globos.listdir来获取目录中的文件列表,从而避免维护文件列表... - Matthieu M.
@Matthieu M. 如果我不懂 Python,你还会认为这是一个优势吗? - ccook
1
@ccook:我在将我的应用从Make迁移到SCons的过程中学习了Python ;) Python文档质量非常好,而且它是一种广泛使用的语言,这意味着你遇到的大多数问题都已经在论坛或问答网站上得到了解答,而且谷歌可以帮助你找到它们。 - Matthieu M.

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