Код в заголовочных файлах, кажется, вызывает ошибки при компиляции - PullRequest
2 голосов
/ 19 августа 2011

У меня есть программа CLI, состоящая из одного файла vt.c, который компилируется и запускается под Windows (cmd.exe) с использованием Open Watcom. Я также могу скомпилировать его для Linux во время работы Open Watcom в Windows (и полученная сборка будет работать под Linux).

Однако, когда я пытаюсь скомпилировать его под Linux (используя make, который вызывает cc), я получаю 375 строк сообщений об ошибках. Вот некоторые из них, где многие последующие ошибки были похожи, я вставил только первые несколько:

In file included from vt.c:4:0:
process.h: In function ‘__declspec’:
process.h:45:22: error: storage class specified for parameter ‘execl’
process.h:46:1: error: expected declaration specifiers before ‘__declspec’
process.h:47:1: error: expected declaration specifiers before ‘__declspec’
...
In file included from vt.c:5:0:
ctype.h:48:1: warning: empty declaration
ctype.h:81:37: error: storage class specified for parameter ‘__ctype_b_loc’
ctype.h:82:6: warning: ‘__nothrow__’ attribute ignored
ctype.h:83:28: error: storage class specified for parameter ‘__ctype_tolower_loc’
ctype.h:84:6: warning: ‘__nothrow__’ attribute ignored
ctype.h:85:28: error: storage class specified for parameter ‘__ctype_toupper_loc’
ctype.h:86:6: warning: ‘__nothrow__’ attribute ignored
...
In file included from vt.c:6:0:
string.h:44:14: error: storage class specified for parameter ‘memcpy’
string.h:46:6: warning: ‘__nothrow__’ attribute ignored
string.h:49:14: error: storage class specified for parameter ‘memmove’
string.h:50:6: warning: ‘__nothrow__’ attribute ignored
string.h:57:14: error: storage class specified for parameter ‘memccpy’
string.h:59:6: warning: ‘__nothrow__’ attribute ignored
...
vt.c:28:1: warning: empty declaration
vt.c:41:1: warning: empty declaration
vt.c:50:1: error: parameter ‘maxtextlength’ is initialized
vt.c:70:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
vt.c:123:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
vt.c:158:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
...
vt.c:67:6: error: declaration for parameter ‘clearinputbuffer’ but no such parameter
vt.c:66:6: error: declaration for parameter ‘clrscr’ but no such parameter
vt.c:65:6: error: declaration for parameter ‘testrandom’ but no such parameter
...
string.h:579:14: error: declaration for parameter ‘stpncpy’ but no such parameter
...
ctype.h:268:12: error: declaration for parameter ‘toupper_l’ but no such parameter
...
process.h:45:22: error: declaration for parameter ‘execl’ but no such parameter
vt.c:608:1: error: expected ‘{’ at end of input
make: *** [vt] Error 1

Моя проблема, как (я уверен) у многих раньше: я просто хочу, чтобы она скомпилировалась.

Вопрос 3641178, кажется, предполагает, что порядок включаемых файлов важен, но заголовки, которые выдают ошибки, приходят ПОСЛЕ всех остальных включаемых файлов в vt.c.

Я попытался установить Open Watcom в Linux, и предоставленные заголовочные файлы совпадают. Насколько я знаю, это стандартные заголовочные файлы, и я не могу придумать причину, по которой они должны вызывать ошибки компиляции.

Если кто-нибудь сможет пролить свет на это, я был бы очень благодарен. Полный каталог можно найти в моем репозитории git по адресу git@github.com: megamasha / Vocab-Tester.git (https://github.com/megamasha/Vocab-Tester)

1 Ответ

5 голосов
/ 19 августа 2011

Ваш process.h, string.h, ... поступил от определенного компилятора (watcom) и содержит ключевые слова для компилятора (например, __declspec), которые не поддерживаются gcc (компилятор, обычно используемый в Linux).

Что касается string.h и ctype.h, вам следует полностью удалить их из каталога, а #include - с помощью угловых скобок (<...>): это стандартные заголовки и каждый компиляторпредоставьте его версии (которые совместимы с тем, что говорится в стандарте).

С process.h ситуация немного сложнее, так как это нестандартный заголовок.Тем не менее, насколько я вижу, process.h, кажется, содержит только некоторые функции, которые используются для порождения процессов, и, на первый взгляд, кажется, что вашему приложению это не нужно;если это так, просто удалите process.h и соответствующий #include.В противном случае, скажите мне в комментарии, возможно, есть быстрая стандартная (или зависящая от ОС, но не зависящая от компилятора) замена.

...