Создайте проект с несколькими каталогами с помощью компилятора 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-файлами?

Заметки:

  1. Та же самая структура работает, используя gcc и gnu make.

  2. Нет возможности построить проект в Visual Studio

  3. Нет возможности скопировать файл из хеш-таблицы, а каталоги парсера являются основным каталогом проекта.

  4. Переименование целей хеш-таблицы и парсера не решает проблему.

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-файл.

Это классная работа, о которой вы должны были спросить своего наставника?

Другие вопросы по тегам