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

时间:2011-12-15 19:22:44

标签: c visual-studio mingw nmake

我目前在大学的工作是将一个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'

2 个答案:

答案 0 :(得分:1)

我刚刚用MinGW尝试了这个数组声明,它确实编译了。但是,要使其链接,需要在其他地方定义数组。结果是它看起来与extern存储类相同:

extern enumeratorConverterEntry enumeratorConverterEntries[];

我不确定使用静态存储类对原始声明是否还有其他细微之处。

答案 1 :(得分:1)

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

这看起来像一个有效的不完整的数组前向声明,这将是有效的语法,除了我认为静态限定符。我没有在我面前的'C'标准的副本,但在谷歌搜索“静态数组的前向声明”结果的行之间读取似乎表明静态的不完整定义 array导致未定义的行为,因此Microsoft和GNU合法地有权使用它做任何他们想做的事情。 GNU接受它,微软拒绝它。正如Mark Wilkins所指出的那样,你应该通过将其替换为:

来使Microsoft编译器满意
extern enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */

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

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