编译 C++ 代码以在 Windows 和 Linux 中表现相同 [关闭]

Posted

技术标签:

【中文标题】编译 C++ 代码以在 Windows 和 Linux 中表现相同 [关闭]【英文标题】:Compile C++ Code to behave the same in Windows and Linux [closed] 【发布时间】:2013-04-01 13:01:02 【问题描述】:

我已经安装了 cygwin 并用它在 Windows 上编写 C++。

我更喜欢在 Windows 中编写我的代码(这些是分配),但代码还需要能够在 Linux 上运行。虽然代码在大多数情况下都可以很好地移植,但似乎有些东西在 Windows 上有效,但在 Linux 上会导致段错误(例如引用未初始化的变量和指针)。

我在 Windows(通过 C:\cygwin\bin\g++.exe)和 Linux 中都使用 g++ 进行编译,我不明白为什么在前者中工作的代码在后者中失败(或者为什么它们不简单行为相同)。如何让我的代码在两者中的行为完全相同?这甚至可能吗?

虽然我是 C++ 菜鸟,但我没有使用任何特定于 Windows 的库,所以我可能会误解一些简单/重要的事情。最后,我知道使用未初始化的变量和指针是不好的——我想在 Windows 中使用它们会导致分段错误。

【问题讨论】:

最有可能的未定义行为 - 你在两者上都做错了,但它只会在一个上崩溃。如果您编写了正确的代码,它应该可以工作。发布崩溃的确切代码。 【参考方案1】:

您所描述的“引用未初始化的变量和指针”称为未定义行为。这意味着“你的运气可能会有所不同”——它可能在一个系统上以一种方式做某事,而在另一个系统上做另一件事。不幸的是,作为“C 和 C++ 应该是高效语言”的一部分,未定义行为的行为就是这样 - 编译器不需要关心它,并且 C 或 C++ 标准中没有定义什么应该会发生。

如果您将-Wall 应用于您的编译器,它应该会为您提供几乎所有类型的未初始化变量的警告。

制定你的规则,每当你声明一个变量时,你也要给它一个值。这样做从来都不是一个坏主意。即使它只是为其分配了一些无用的值,它也比试图找出为什么你的计算在四级嵌套循环深处的某个地方出错要好。

您也可以尝试使用 Microsoft Visual Studio 工具 - 这些工具有一个免费的“Express Edition”。如果您使用调试模式编译,它将生成额外的代码来(尝试)检测未初始化变量的使用。

我不知道有一个“库”可以让您在未初始化的变量上出错。

【讨论】:

感谢您对未定义行为的解释。此外,添加 -Wall 给了我一个很好的(长)列表,列出了我没有初始化的所有内容,并且来自 Java,这会有所帮助。 只是补充一点:使用-ansi-pedantic 也有助于提高可移植性。【参考方案2】:

如引用未初始化的变量和指针

没错。根据我的经验,我发现在 Windows 上编译的 C++ 代码(使用 Visual C++MinGW GCC)指针未初始化为 NULL。

所以这样的事情不会出现段错误。 (你没有得到你想要的,但至少你不知道它。残忍。)

int *p;
*p = 1;
std::cout<<*p;

但在 Linux 系统 (GCC) 上,至少似乎将它们初始化为 NULL。所以上面的代码会出现段错误。

最好的解决方案是为您正在使用的编译器打开未初始化的变量警告 (gcc Wuninitialized),然后告诉它将所有警告视为错误 (gcc Werror)。

您至少可以在尝试移植代码之前执行此操作。

要获得更好的分析,您可以使用valgrind 等工具。

【讨论】:

以上是关于编译 C++ 代码以在 Windows 和 Linux 中表现相同 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何准备代码库以在基于 Windows 和 Unix 的系统上进行编译

使用 MinGW C++ 编译 64 位静态库以在 Java (JNI) 中使用

如何将文件名作为 C++ 编译参数传递以在介子构建中使用?

无法获得简单的 2D 着色器以在 C++ openGL 中绘制红色三角形(无编译器错误)

函数之间的数组指针丢失值(用 swig 编译以在 python3 中使用)

如何使用WINE在Linux上使用Windows .lib