我有一个需要使用nmake和Microsoft构建的C项目 编译器。该项目的结构是:
project_root
|-- parser
| |-- parser.tab.c
| |-- Makefile
|-- hashtable
| |-- hash_table.h
| |-- hash_table.c
| |-- Makefile
|-- Makefile
|-- main.c
|-- shell.c
|-- shell.h
项目的Makefile包含构建子项目解析器的规则 每个相应目录中的哈希表。主要相关摘录 生成文件:
CFLAGS=/W3 /EHsc /nologo /Iparser /Ihashtable
all: build
run: build
.\$(EXE)
build: $(EXE)
$(EXE): shell.obj parser\parser.tab.obj hashtable\hash_table.obj
$(CC) /Fe$(EXE) $**
shell.obj: shell.c
$(CC) $(CFLAGS) /c shell.c
parser.tab.obj: parser
hash_table.obj: hashtable
hashtable:
cd hashtable && nmake
parser: parser\parser.tab.c parser\parser.yy.c
cd parser && nmake build_lex
哈希表中的Makefile包含:
hash_table.obj: hash_table.c hash_table.h
$(CC) $(CFLAGS) /c hash_table.c
在哈希表目录中运行nmake时,没有错误或警告, 但是当我在主项目目录中运行nmake时,会出现大量错误 像这样:
hashtable \ hash_table.h(24):错误C2059:语法错误:'常量'
hashtable \ hash_table.h(29):错误C2143:语法错误:缺少')'在'*'之前
hashtable \ hash_table.h(29):错误C2143:语法错误:在'*'之前缺少'{'
hashtable \ hash_table.h(29):错误C2059:语法错误:')'
hashtable \ hash_table.h(59):错误C2061:语法错误:标识符'equal_func'
hashtable \ hash_table.h(60):错误C2059:语法错误:'}'
hashtable \ hash_table.h(63):错误C2143:语法错误:在'*'之前缺少'{'
hashtable \ hash_table.h(63):错误C2146:语法错误:在标识符'ef'之前缺少')'
hashtable \ hash_table.h(63):错误C2081:'equal_func':正式参数列表中的名称非法
hashtable \ hash_table.h(63):错误C2061:语法错误:标识符'ef'
hashtable \ hash_table.h(63):错误C2059:语法错误:';'
hashtable \ hash_table.h(63):错误C2059:语法错误:')'
hashtable \ hash_table.h(64):错误C2143:语法错误:缺少')'之前'*'
hashtable \ hash_table.h(64):错误C2143:语法错误:在'*'之前缺少'{'
hashtable \ hash_table.h(64):错误C2059:语法错误:')'
hash_table.h中的相关行是:
21 /* Boolean data type */
22 typedef enum boolean
23 {
24 FALSE = 0,
25 TRUE
26 } boolean_t;
27
28 typedef unsigned int (*hash_func)(const char *str, unsigned int hash_len);
29 typedef boolean_t (*equal_func)(const char *str1, const char *str2);
53 typedef struct hashtable
54 {
55 /*
56 * Some code
57 *
58 */
59 equal_func eq_fun;
60 } hashtable_t;
有什么问题?代码或者代码有问题 生成文件?
注意:
使用gcc和gnu make可以使用相同的结构。
在Visual Studio中无法构建项目
没有从hashtable复制文件的选项,解析器目录就是 主项目目录。
重命名哈希表和解析器目标并不能解决问题。
答案 0 :(得分:0)
虽然你没有真正给出足够的信息让某人能够正确回答,这就是为什么它仍然没有得到很长时间的答复,但我可以看到问题可能存在的一些方面。
你可能已经得出结论是什么原因导致了这个问题,并给出了相关的摘录"你有隐藏的信息我们需要重现问题并找到答案。
例如,当您这样做时:
parser: parser\parser.tab.c parser\parser.yy.c
cd parser && nmake build_lex
目录中没有parser.yy.c。我们没有看到关于如何调用flex和bison的信息。通过在* .l和* .y文件中的错误位置放置包含,或者未注意到flex和bison源中存在错误导致错误的代码,我看到人们构建flex和bison程序的许多错误产生。在我们去查看makefile之前,需要先消除这些原因。
这课程是否应该让你的导师问过这个课程?