перенос C компиляции из MinGW в VisualStudio (nmake) - PullRequest
0 голосов
/ 15 декабря 2011

Моя текущая работа в университете - портировать программу на C с MinGW (windows) на Visual Studio (nmake).

У меня есть действительный файл "makefile.vc" для очень похожей программы на Си. Мой подход состоял в том, чтобы принять Makefile (т.е. makefile.vc) к программе, которую мне нужно портировать.

Все файлы, кроме четырех, похоже, скомпилированы нормально. Эти четыре файла имеют различные ошибки, например, синтаксические ошибки и «неизвестный размер».

Должен ли я продолжить свой подход, чтобы изменить 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 ]

1 голос
/ 16 декабря 2011
static enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */

Это выглядит как допустимое неполное, прямое объявление массива, который был бы действительным синтаксисом, за исключением, я думаю, статического классификатора.У меня нет копии стандарта 'C' передо мной, но чтение между строк в результатах Googling "прямого объявления статического массива", кажется, указывает на то, что неполное определение static массив приводит к неопределенному поведению, поэтому Microsoft и GNU имеют законное право делать с ним все, что хотят.GNU принимает это, а Microsoft отвергает.Как отмечает Марк Уилкинс, вы должны порадовать компилятор Microsoft, заменив его на:

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

В общем, стоит отметить, что компилятор Microsoft поддерживает только стандарт C89, а компилятор GNU поддерживает частиСтандарт C99 и несколько собственных расширений, в зависимости от аргументов компилятора.

Ошибки в файлах fAssemble.c и fStack.c выглядят так, что один или несколько файлов препроцессора отсутствуют или неполны.Вы должны найти свой источник, чтобы узнать, где определены CONST и l_Interp, а затем выяснить, почему они не обнаруживаются в файлах, где происходят ошибки.

1 голос
/ 16 декабря 2011

Я только что попробовал объявление этого массива с MinGW, и оно компилируется. Однако, чтобы сделать его ссылочным, он должен быть определен в другом месте. В результате он выглядит так же, как и внешний класс хранения:

extern enumeratorConverterEntry enumeratorConverterEntries[];

Я не уверен, есть ли другие тонкости, связанные с исходным объявлением, использующим статический класс хранения для глобального.

...