将 C 编译从 MinGW 移植到 VisualStudio(nmake)

Posted

技术标签:

【中文标题】将 C 编译从 MinGW 移植到 VisualStudio(nmake)【英文标题】:porting C compilation from MinGW to VisualStudio(nmake) 【发布时间】:2011-12-15 19:22:43 【问题描述】:

我目前在大学的工作是将 C 程序从 MinGW (windows) 移植到 Visual Studio (nmake)。

我有一个非常相似的 C 程序的有效“makefile.vc”文件。 我的方法是对我需要移植的程序采用 Makefile(即“makefile.vc”)。

除了四个 C 文件之外的所有文件似乎都可以正常编译。这四个文件有各种错误,例如语法错误和“未知大小”。

我应该继续我的方法来更改 Makefile 还是使用 CMAKE 代替 nmake?

是否有关于将 C 程序从 MinGW/gcc 移植到 nmake 的教程或任何其他指针?

typedef struct 
  A_TypeConverter *converter;
  char *domain;
 enumeratorConverterEntry;
static enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */

错误:

f.c(186) : error C2133: 'enumeratorConverterEntries' : unknown size


typedef struct AsmInstructionInfo 
  int flags;
  CONST char **argTypes; /* line 7 */
  int minArgs;
  int maxArgs;
  int cArgs;
 AsmInstructionInfo;

错误:

fAssemble.c(7) : error C2061: syntax error : identifier 'CONST'

..

/* file fStack.c: */

#ifdef CHECK_ACTIVATION_COUNTS

/* code */
#endif

/* more code */

void fShowStack(l_Interp *interp)  /* line 94 */
    l_CallFrame *framePtr;

/* more code */

错误:

 fStack.c(94) : error C2143: syntax error : missing ')' before '*'
 fStack.c(94) : error C2143: syntax error : missing '' before '*'
 fStack.c(94) : error C2059: syntax error : ')'
 fStack.c(94) : error C2054: expected '(' to follow 'interp'

【问题讨论】:

您的问题似乎不在 make/nmake 中,而在 C 程序本身。你能给出准确的错误信息和相关的代码片段吗? 你不能像这样在 C 数组中定义。您的错误与移植无关。 感谢您的信息!使用 MinGW 编译时相同的文件...它可以 100% 工作并且所有测试用例 (~3000) 通过。它还可以在 linux 上使用 gcc 编译。我真的错过了一些东西。 【参考方案1】:
static enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */

这看起来像是一个有效的、不完整的数组前向声明,这将是有效的语法,除了我认为是静态限定符。我面前没有“C”标准的副本,但是在谷歌搜索“静态数组的前向声明”结果的两行之间阅读似乎表明 static 的定义不完整 em> 数组会导致未定义的行为,因此 Microsoft 和 GNU 合法地有权使用它为所欲为。 GNU 接受它,而微软拒绝它。正如 Mark Wilkins 指出的那样,您应该通过替换它来让 Microsoft 编译器满意:

extern enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */

通常值得注意的是,Microsoft 编译器仅支持 C89 标准,而 GNU 编译器支持 C99 标准的一部分,以及它们自己的一些扩展,具体取决于编译器的参数。

fAssemble.c 和 fStack.c 中的错误看起来像一个或多个预处理器文件丢失或不完整。您应该搜索您的源以找出 CONST 和 l_Interp 的定义位置,然后找出为什么它们没有在发生错误的文件中被拾取。

【讨论】:

【参考方案2】:

我刚刚用 MinGW 尝试了该数组声明,它确实可以编译。但是,要使其链接,它需要在其他地方定义数组。结果看起来和extern存储类一样:

extern enumeratorConverterEntry enumeratorConverterEntries[];

我不确定是否存在与使用全局静态存储类的原始声明相关的其他微妙之处。

【讨论】:

以上是关于将 C 编译从 MinGW 移植到 VisualStudio(nmake)的主要内容,如果未能解决你的问题,请参考以下文章

如何将使用sysioctl.h的代码移植到MinGW gcc中?

将代码从 Linux 移植到 MinGW

将 std::wstring 从 Visual Studio 移植到 mingw gcc

VS Code编译编译C代码的另一种方法

VS Code编译编译C代码的另一种方法

如何使用 MinGW 在 Linux 上构建 Crypto++ 库?