使用nmake和microsoft编译器构建一个多目录项目

时间:2014-03-06 16:43:53

标签: c windows makefile nmake

我有一个需要使用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;

有什么问题?代码或者代码有问题 生成文件?

注意:

  1. 使用gcc和gnu make可以使用相同的结构。

  2. 在Visual Studio中无法构建项目

  3. 没有从hashtable复制文件的选项,解析器目录就是 主项目目录。

  4. 重命名哈希表和解析器目标并不能解决问题。

1 个答案:

答案 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之前,需要先消除这些原因。

这课程是否应该让你的导师问过这个课程?