Создайте проект с несколькими каталогами с помощью компилятора nmake и Microsoft
У меня есть проект C, который должен быть собран с использованием nmake и компилятора Microsoft. Структура проекта:
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: синтаксическая ошибка: "константа"
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;
В чем проблема? Что-то не так с кодом или с make-файлами?
Заметки:
Та же самая структура работает, используя gcc и gnu make.
Нет возможности построить проект в Visual Studio
Нет возможности скопировать файл из хеш-таблицы, а каталоги парсера являются основным каталогом проекта.
Переименование целей хеш-таблицы и парсера не решает проблему.
1 ответ
Хотя вы на самом деле не дали достаточно информации, чтобы кто-то мог правильно ответить, поэтому она так долго оставалась без ответа, я вижу некоторые области, в которых может возникнуть проблема.
Вы, вероятно, сделали поспешные выводы о причинах проблемы, и, предоставив "Соответствующие выдержки", вы получите скрытую информацию, которая нам необходима для воспроизведения проблемы и поиска ответа.
Например, когда вы делаете это:
parser: parser\parser.tab.c parser\parser.yy.c
cd parser && nmake build_lex
У вас нет parser.yy.c в каталоге. Мы не видим информации о том, как называются flex и bison. Я вижу много ошибок от людей, создающих программы flex и bison, которые либо помещают include в неправильное место в файлах *.l и *.y, либо не замечают, что в источнике flex и bison есть ошибки, приводящие к неправильному коду. генерироваться. Эти причины должны быть устранены, прежде чем мы сможем взглянуть на make-файл.
Это классная работа, о которой вы должны были спросить своего наставника?