2017-12-27 472 views
2

我将为Windows和Unix操作系统体系结构开发一个命令行工具。但是我正在面临一场斗争。我怎样才能使代码在Windows和Unix之间有效地转换?Microsoft Visual Studio:Windows和Unix项目源代码兼容性

项目将主要使用MS Visual Studio C++语言编写。不过,我希望我的工具是跨平台的,所以我可以在Windows和Unix系统中使用它。由于Unix不支持Visual Studio,因此我需要在某种程度上设计代码结构以支持两种体系结构(都是32位),并且OS专用标头需要包含在代码所在的唯一一个操作系统体系结构中。

所以我在寻求你的帮助。为Windows和Unix维护几乎相同的代码的最有效方法是什么?对于该特定操作系统的所有必需头文件?所以我可以在Windows中创建program.exe文件,在Unix中创建program.run文件?测试当前操作系统体系结构(Windows或Unix)的一些条件,并包括与操作系统相关的头文件?

怎样编码?由于Windows命令行使用MS-DOS编码(在中欧,它是DOS代码页852),Unix终端使用UTF-8编码。我的工具将是多语言的(与贡献者,从我的身边开始英语和捷克语)。

我需要保持代码结构尽可能小,当然也容易维护。源代码应该可用于来自GitHub存储库的克隆/分支。

如果这不是适合堆栈溢出的问题,那么只需告诉我,我会删除它。只是寻求帮助,没有别的。

+0

开始使用'CMake'来生成你的项目。如果可能,请勿直接使用任何操作系统功能。使用标准的C++。如果你需要一些操作系统功能,看看增强提供你想要的。使用git代码。不要将任何二进制文件或甚至生成的文件(如项目文件)放入仅存储库的源代码中。 – drescherjm

+0

是的,使用'cmake'。它现在支持VS 2017,并且可以帮助标题差异,而不必制作特定于操作系统的东西。如果这是不可避免的,请将该代码放入操作系统抽象层。 – zzxyz

+0

我有VS 2015社区版。它支持CMake吗? – Polda18

回答

3

步骤1)设置您的持续集成系统,从第一天起每次都在Windows和Unix上构建代码。最好在每个平台上有多个编译器。

步骤2)使用跨平台构建系统,如sconscmake

步骤3)不要在程序中使用任何平台相关的代码在所有 - 当你来,实现在各种ifdef警卫多个版本。优先使用跨平台库。

步骤4)请确保您有足够的单元测试(特别是对位,你必须使用特定于平台的代码来实现的东西多次),并确保您的CI系统运行所有测试为每次提交。

步骤5)确保从第一天开始所有文本都是UTF-8编码 - 转换为其他编码可以发生在显示层,但在内部保留UTF-8的所有内容。

步骤6)在所有支持的平台上进行大量的手动测试。

并确保调整每个编译器的警告设置waaay并发出警告错误(并修复所有这些错误)。在一个平台上使用一个编译器的警告通常会在另一个平台上以不同编译器的方式静默编译。

+0

好的,谢谢你的提示。在我的Windows机器上安装CMake 3.10.1,并将其安装到我的Linux虚拟机中... – Polda18

+0

@ Polda18 - Linux VM?如果可以的话,我会在Windows 10中查看WSL功能。与虚拟机相比,它非常便于开发。虚拟机是好的,当然会起作用。 – zzxyz

+0

@zzxyz - 你的意思是Ubuntu Shell功能?开机后,我的安装被破坏并立即关闭。甚至不想要卸载修复... – Polda18

0

首先,Windows控制台可以使用utf-16,但不能使用utf-8。其次,如果你坚持使用标准的C++库,可能使用boost进行扩展(必须安装在windows和任何你将建立的* nix系统上),只要你在说话,你真的不应该有任何问题关于严格接受执行工作和打印结果的命令行参数。

如果你谈论的是终端控制(即,屏幕某处比下一个字符细胞等,特别是要落后于印刷)这将是更困难不少。

我会,不过,建议您使用cmake的基于项目时,Visual Studio通常使用自定义的MSBuild构建管理和是不会帮助,如果你尝试的* nix系统建设。