编译旧的 C++ unix 应用程序以在 Windows 中使用

Posted

技术标签:

【中文标题】编译旧的 C++ unix 应用程序以在 Windows 中使用【英文标题】:Compile old C++ unix application for using in windows 【发布时间】:2009-01-14 06:50:55 【问题描述】:

对于 1994 年为 UNIX 编写的某些代码,我需要有一个 Windows 可执行文件。我试图从 cygwin 环境中做到这一点。从那时起,C++ 标准和标准库都发生了变化。

我尝试使用 -std= 和 -traditional-cpp 选项,但这些选项对我没有任何帮助。我还发现 -fno-for-scope 和 -fno-operator-names 减少了错误的数量。从那时起,输入/输出库也发生了重大变化。我也认为从那时起预定义的(由预处理器)宏也有可能发生变化。

作者对代码的注释:http://research.microsoft.com/en-us/um/people/hoppe/code.htm

【问题讨论】:

如果您描述了在尝试编译此代码时遇到的至少一个错误、您为纠正错误所做的尝试以及结果如何,这可能会对我们有所帮助。 【参考方案1】:

库(库/linpack 和库/食谱)中的 C 代码可以很好地编译使用:

gcc -c *.c

C++ 代码问题更大。 ../include 中有头文件,它们需要 -DANSI 来生成函数原型。它们没有在标题中声明extern "C";它们正确包含在 C++ 源目录的标题中:

extern "C" 
#include "linpack.h"

所以,编译 A3dStream.C,我得到:

$ g++ -DANSI -I../include -c A3dStream.C
In file included from /usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/iostream.h:31,
                 from Hh.h:12,
                 from A3dStream.C:4:
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/backward/backward_warning.h:32:2:
warning: #warning This file includes at least one deprecated or antiquated header.
Please consider using one of the 32 headers found in section 17.4.1.2 of the C++
standard.    Examples include substituting the <X> header for the <X.h> header for
C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable
this warning use -Wno-deprecated.
In file included from A3dStream.C:4:
Hh.h:15:23: strstream.h: No such file or directory
In file included from A3dStream.C:4:
Hh.h:45: error: declaration of C function `void bzero(void*, int)' conflicts with
/usr/include/string.h:54: error: previous declaration `void bzero(void*, size_t)' here
Hh.h:46: error: declaration of C function `int gethostname(char*, int)' conflicts with
/usr/include/sys/unistd.h:206: error: previous declaration `int gethostname(char*, size_t)' here
Hh.h:98: error: an explicit specialization must be preceded by 'template <>'
Hh.h:105: error: an explicit specialization must be preceded by 'template <>'
Hh.h:111: error: an explicit specialization must be preceded by 'template <>'
Hh.h:221: error: new declaration `void unsetenv(const char*)'
/usr/include/cygwin/stdlib.h:26: error: ambiguates old declaration `int unsetenv(const char*)'
In file included from Geometry.h:10,
                 from A3dStream.h:7,
                 from A3dStream.C:5:
Array.h: In member function `void Array<T>::resize(int)':
Array.h:40: error: `size' undeclared (first use this function)
Array.h:40: error: (Each undeclared identifier is reported only once for each function it appears in.)
Array.h:44: error: `a' undeclared (first use this function)
Array.h: In member function `void Array<T>::clear()':
Array.h:51: error: `a' undeclared (first use this function)
Array.h:51: error: `size' undeclared (first use this function)
Array.h: In member function `void Array<T>::init(int)':
Array.h:53: error: `size' undeclared (first use this function)
Array.h: In member function `void Array<T>::need(int)':
Array.h:57: error: `size' undeclared (first use this function)
Array.h: In member function `Array<T>& Array<T>::operator+=(const T&)':
Array.h:64: error: `a' undeclared (first use this function)
Array.h: In member function `void Array<T>::squeeze()':
Array.h:66: error: `size' undeclared (first use this function)
Array.h: In member function `const T& Array<T>::operator[](int) const':
Array.h:70: error: `a' undeclared (first use this function)
Array.h: In member function `T& Array<T>::operator[](int)':
Array.h:71: error: `a' undeclared (first use this function)

其他文件产生类似的错误集。

我在 Windows XP 下的 Cygwin 上使用 GCC 3.4.4。

我不是 C++ 专家——尽管我在软件考古方面做了相当多的工作——但在我看来,您需要更新代码以使用 C++ 标准头文件,因为 strstream.h 尤其缺失(因此,名义上,请改用&lt;strstream&gt;),这意味着您必须处理std 命名空间等。这段代码比标准早了 5 年,因此必须努力破解它以使其更新并不是没有道理的。

祝你好运!

【讨论】:

【参考方案2】:

我可以想到两种可能性:AT&T 提供 UWIN(可能与 Cygwin 有足够的不同以避免同样的麻烦)和 old versions of CFront 的源代码(可能是使用的原始编译器)。

嗯,还有第三种可能性,我认为这是推荐的操作:编辑源代码并使其与标准保持同步。如果您打算对此代码进行任何进一步的开发,最好尽快咬紧牙关。

【讨论】:

【参考方案3】:

您仍然可以从 GNU 网站下载 gcc 2.7.0 的源代码。

您可以下载并制作旧版本的编译器。

【讨论】:

以上是关于编译旧的 C++ unix 应用程序以在 Windows 中使用的主要内容,如果未能解决你的问题,请参考以下文章

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

执行任何 IO/流时 C++ JNI 崩溃/挂起

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

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

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

将新的 MS C++ 编译器与旧的 Visual Studio 一起使用