我有一个CLI程序,由一个vt.c文件组成,该文件使用Open Watcom在Windows(cmd.exe)下编译和运行。我也可以在Windows上运行Open Watcom时为Linux编译它(并且生成的构建在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中所有其他包含的文件之后出现错误的标题。
我尝试在Linux上安装Open Watcom,提供的头文件是相同的。据我所知,这些是标准的头文件,我可以认为它们没有理由导致编译错误。
如果有人能对此有所了解,我将非常感激。整个目录可以在我的git repo中访问git@github.com:megamasha / Vocab-Tester.git(https://github.com/megamasha/Vocab-Tester)
答案 0 :(得分:5)
您的process.h
,string.h
,...来自特定的编译器(watcom),并包含{{1}不支持的特定于编译器的关键字(例如__declspec
) (编译器通常在Linux上使用)。
就gcc
和string.h
而言,您应该从目录中完全删除它们,并使用尖括号(ctype.h
)#include
它们:它们是标准标题并且每个编译器都提供其版本(与标准所说的兼容)。
对于<...>
,情况有点困难,因为它是一个非标准的标题。尽管如此,据我所知,process.h
似乎只包含一些用于生成进程的函数,而且从快速看,似乎你的应用程序不需要它;如果是这样,请删除process.h
和相对process.h
。否则,请在评论中告诉我,可能有一个快速标准(或特定于操作系统,但不是特定于编译器)的替换。