ошибка: невозможно указать -o при создании нескольких выходных файлов - PullRequest
0 голосов
/ 02 марта 2020

Как исправить эту ошибку?

Я пытаюсь скомпилировать проект C, но я получаю такую ​​ошибку

Alekseys-MBP:mmn14 aleksey$ make
gcc -Wall -ansi -pedantic -c -o assembler.o assembler.c
gcc -Wall -ansi -pedantic -c -o utils.o utils.c
gcc -Wall -ansi -pedantic -c -o symbol_table.o symbol_table.c
gcc -Wall -ansi -pedantic -c -o file_scan.o file_scan.c
file_scan.c:323:2: warning: no newline at end of file [-Wnewline-eof]
}
 ^
1 warning generated.
gcc -Wall -ansi -pedantic -c -o data_block.o data_block.c
gcc -Wall -ansi -pedantic -c -o commands.o commands.c
gcc -Wall -ansi -pedantic assembler.o utils.o symbol_table.o file_scan.o utils.h data_block.o commands.o -o assembler 
clang: error: cannot specify -o when generating multiple output files
make: *** [assembler] Error 1

там мой makefile

EXEC_FILE = assembler
C_FILES = assembler.c utils.c symbol_table.c file_scan.c utils.h data_block.c commands.c
H_FILES = common.h symbol_table.h data_block.h commands.h file_scan.h

O_FILES = $(C_FILES:.c=.o)

all: $(EXEC_FILE)
$(EXEC_FILE): $(O_FILES) 
    gcc -Wall -ansi -pedantic $(O_FILES) -o $(EXEC_FILE) 
%.o: %.c $(H_FILES)
    gcc -Wall -ansi -pedantic -c -o $@ $<
clean:
    rm -f *.o $(EXEC_FILE)

Что я делаю не так?

1 Ответ

1 голос
/ 02 марта 2020

Этот список C файлов:

C_FILES = assembler.c utils.c symbol_table.c file_scan.c utils.h data_block.c commands.c

содержит заголовок, файл utils.h.

Когда этот оператор:

O_FILES = $(C_FILES:.c=.o)

создает В списке объектных файлов подстановка .c=.o не изменяет utils.h, в результате чего O_FILES содержит файл заголовка. Затем эта команда сборки:

gcc -Wall -ansi -pedantic $(O_FILES) -o $(EXEC_FILE)

просит G CC выполнить свои действия по умолчанию с файлами, то есть связать объектные файлы и записать исполняемый файл и «прекомпилировать» (проанализировать) заголовок файл и запишите файл данных «предварительно скомпилированный заголовок». Таким образом, у вас есть два выходных файла.

Чтобы исправить это, удалите utils.h из C_FILES и поместите его в H_FILES.

...