我有一個需要使用nmake和微軟編譯器編譯的C工程。該項目的結構是:用nmake和微軟編譯器構建一個多目錄工程
project_root
|-- parser
| |-- parser.tab.c
| |-- Makefile
|-- hashtable
| |-- hash_table.h
| |-- hash_table.c
| |-- Makefile
|-- Makefile
|-- main.c
|-- shell.c
|-- shell.h
該項目的Makefile文件包含的規則來構建子項目解析器和 哈希表中的每個相應的目錄。從主 的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:語法錯誤:'常量'
散列表\ hash_table.h(29):錯誤C2143:語法錯誤:缺少 ')' '*'
散列表\ hash_table.h(29)之前:錯誤C2143:語法錯誤:缺少 '{' 之前'*'
散列表\ hash_table.h(29):錯誤C2059:語法錯誤: ')'
散列表\ hash_table.h(59):錯誤C2061:語法錯誤:標識符 'equal_func'
散列表\ hash_table.h(60):錯誤C2059:語法錯誤:'}'
哈希表\ hash_table.h(63):錯誤C2143:語法錯誤:缺少 '{' 前 '*'
散列表\ hash_table.h(63):錯誤C2146:語法錯誤:缺少 ')' 前標識符'EF'
哈希表\ hash_table.h(63):錯誤C2081: 'equal_func':名稱正式參數列表非法
哈希表\ hash_table.h(63):錯誤C2061:語法錯誤:標識符「 ef'
hashtable \ hash_table.h(63):error C2059:syntax error:';'
散列表\ hash_table.h(63):錯誤C2059:語法錯誤: ')'
散列表\ hash_table.h(64):錯誤C2143:語法錯誤:缺少 ')' 前 '*'
散列表\ hash_table.h(64):錯誤C2143:語法錯誤:缺少 '{' 前 '*'
散列表\ 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;
是什麼問題?代碼有問題或與makefile有關的問題?
注:
相同的結構工程使用gcc和GNU make。
沒有選項來構建項目在Visual Studio
沒有選項從Hashtable和解析器目錄複製文件是 主項目目錄。
重命名哈希表和解析器目標不能解決問題。