【问题标题】:How do I know if a C program will written on Linux will work elsewhere我如何知道在 Linux 上编写的 C 程序是否可以在其他地方工作
【发布时间】:2017-12-10 15:43:07
【问题描述】:

我需要你解释一下,如果我在 Linux 上编写 C 程序并且它可以在该 Linux 上运行,我如何知道我的 C 程序是否可以在例如 Windows 上运行,反之亦然(用 Windows 编写的程序)

另外,我必须遵循哪些标准来编写可在不同操作系统上运行的程序?如何检测库中的函数或整个库中的函数是否可以在不同的操作系统上运行?

例如,我有函数 freadfwritefopenfclosefrom 库 stdio.h - 我如何知道我是否可以在 Linux 以外的其他系统上正常使用它们?与使用文件描述符的函数相同:opencreatclosereadwrite 来自库:sys/types.hsys/stat.hfcntl.h

【问题讨论】:

  • 困难的方法:阅读文档。更简单的方法:在 Windows 上编译和测试它。经验法则:stdio.h 的东西通常或多或少兼容。
  • 大部分标准库都适用于 windows 和 linux
  • 程序是指为不同平台编译的源代码,还是为单个平台编译的二进制文件?
  • 如果你觉得特别淘气并且真的喜欢 linux,你可以让它尽可能地与任何其他操作系统不兼容。然后,您不仅可以忽略兼容性问题,而且还会让一大群人使用您最喜欢的操作系统来使用您的软件。赢赢! (这是个玩笑,不要真的这样做)

标签: c linux windows operating-system


【解决方案1】:

嗯,这有点简单:只要你的程序只使用两件事,它就可以在 Windows 上运行:

  • C 标准库,如 C 标准中所述。参见例如n1570.pdf,非常接近实际标准的最新草案版本。请注意,很多 C 标准库都带有各种扩展,当然你不能使用 这些。如果有疑问,请编译例如使用 -std=c11 选项(gccclang)应该隐藏所有扩展声明。

    这里还有一个陷阱:微软对 C 标准的实现并不完整。这取决于您的编译器实际链接了哪个 C 标准库,如果是 MinGW,它是非常旧的 msvcrt.dll,仅符合 C89,因此您可能想改为阅读较旧的标准您可以使用哪些功能,例如here's a description of the standard library in C89 使用 Microsoft 的 C 编译器,您还可以在标准库中获得不同级别的 C99 支持(它们链接自己的运行时 DLL),具体取决于版本。

  • 适用于 Windows 的第三方库,例如SDLGTK+

通过使用opencreatclosereadwrite 等,您使用的是 POSIX 中指定的扩展。有些 POSIX 函数在 Windows 上可用,有些略有不同,有些只是缺少。如果您想保持对 Windows 的便携性,最好不要使用这些。此规则的例外情况是,如果您打算使用 Cygwin 编译代码,这是一个完整的 Windows POSIX 兼容层。

根据 IanAbbott 的评论,正确使用整数类型也很重要,而不是隐含地假设“a long 有 64 位”或“ int 可以保存一个指针”,这在一般情况下是错误的。始终将<stdint.h> 类型用于固定宽度,uintptr_t 用于指针值,size_t 用于对象大小等等。


虽然与您的问题没有直接关系:对于大多数重要的程序,您迟早需要使用一些特定于平台的功能。通常,有一些库将其抽象出来,例如如果您需要有效地处理 I/O 事件,而不是在 Linux 上使用 epoll、在 FreeBSD 上使用 kqueue、在 Windows 上使用 IO completion ports 等等,您可以只使用 libevent。但是如果你没有找到这样的库,这里有一个提示:

明确地将特定于平台的代码分离到自己的模块(翻译单元)中。这样一来,将整个事物移植到不同平台的工作会大大减少。

【讨论】:

  • 程序员还需要了解两个平台之间(以及不同 Linux 用户态体系结构之间)标准整数类型的差异。例如,unsigned long 在 64 位 Linux 上是 64 位宽,但在 64 位 Windows 上是 32 位宽。
  • @IanAbbott 我假设类型的合理使用是为了它们的用途,例如使用 (u)intN_t 获得精确宽度,使用 size_t 获得大小等等。但当然,你必须考虑到这一点。
  • 值得补充的是,POSIX 标准的出现是因为美国国防部希望围绕开放标准构建和编写系统。他们已经厌倦了购买无法移植到替代平台的软件,并且不喜欢被国防供应商勒索赎金。尽管 POSIX 有缺点,但它在让事情变得更容易方面做得非常好。他们所做的事情令人钦佩,现在是时候为云、OTT 网络等新事物制定强制性开放标准了。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多