【发布时间】:2012-04-28 23:01:47
【问题描述】:
我正在使用 POSIX API 和 Linux 编写 C 程序。 我在朋友的 Mac OSX PC 上编译并运行它,有一个小错误,但我没有使用 Linux 特定的功能。
我将使用 Linux 添加到 API 的一些特定功能。我还将为 Mac Os X 和 FreeBSD 使用特定的 POSIX 扩展。
我将使用条件编译来选择代码。如果操作系统不是这些,我将使用通用 POSIX 代码。
我没有 Darwin/Mac OSX 和 FreeBSD,Linux 是我 PC 中唯一的操作系统。我无法下载和安装 FreeBSD,因为它超过 500 MB。
我想知道一种方法来测试程序是否会在其他 POSIX 系统上按预期编译和运行。
我想知道是否有一个 POSIX 模拟器和编译器来做测试。
测试很简单,它们不使用 GUI 和驱动程序,它们只是命令行。
我需要做 3 个测试:FreeBSD、Mac OSX/Darwin 和 Generic POSIX,但我没有工具。
编辑
是否有没有 GUI 但带有 GCC/G++ 和 ssh/scp 的 FreeBSD 和 Darwin 的最小版本?达尔文是免费的,不是吗?
我的电脑很旧,但我想我可以将它们安装在虚拟机中,创建虚拟网络并使用 ssh/scp 传输和测试程序。
【问题讨论】:
-
这有点陈词滥调,但“没有可移植的代码;只有已移植的代码'。没有什么可以替代让系统进行测试的。如果做不到这一点,您必须编写可以依赖于不同系统的标准子集。最好避免条件编译;如果你必须使用它,它会使生活复杂化。
-
@Jonathan:虽然这在某种程度上是正确的,但在过去的 5 到 10 年里,它变得越来越少,以至于人们为了“可移植性”而做的许多传统事情“奇怪的系统”现在看起来像是过时的垃圾。我同意双方都有争论,但我认为按照标准进行编码并纠缠实施者以在他们不符合标准时修复其损坏的实施具有很大的优点,可以作为推动未来的一种方式我们不必玩“移植到每个目标”的游戏。
-
当大玩家加入时,它也取得了更大的成功。另一方面,GCC 对大量 UB 的打击(如签名溢出和别名违规)一开始确实破坏了一些东西,但它在让程序员修复他们被破坏的程序方面已经走了很长一段路。大牌应用程序从应用程序方面采取的一些类似的大胆行动可能会产生重大影响。顺便说一句,采用这种方法并不一定意味着您的程序不会在流行的损坏平台上运行。这只是意味着您必须提供修复/粘合层才能使您的标准目标代码在那里运行。
-
由于提问者将“使用 Linux 添加到 API 中的一些特定功能”,因此代码的行为可能在任何地方都不相同,至少在提供 Linux 扩展功能的额外工作的情况下并非如此。我认为双启动或运行 VM 的 FreeBSD 应该相对简单(因此无法在 FreeBSD 上进行测试是盲目的); Mac OS X 的问题更大。它确实取决于将要使用的功能;你可以在没有条件编译的情况下做很多可移植的事情。
标签: c linux testing posix compatibility