не может указывать -o при генерации нескольких выходных файлов

У меня вопрос о make-файле с использованием gcc, ниже мой код в make-файле. Я получил не могу указать -o при генерации нескольких ошибок выходных файлов, но я просто не могу понять, где проблема. Может ли кто-нибудь указать на мои ошибки? Спасибо!

BASE_FILES=bwtsearch.c bwtsearch.h bwttext.c bwttext.h chartable.c chartable.h common.h occtable.c occtable.h plset.c plset.h strbuf.c strbuf.h BASE_ENCODER_FILES=bwtencoder.h bwtencoder.c BWTSEARCH_FILES=${BASE_FILES} main_bwtsearch.c BENCODE_FILES=${BASE_ENCODER_FILES} main_bencode.c PSEARCH_FILES=${BASE_FILES} main_psearch.c PSEARCH_NL_FILES=${BASE_FILES} main_psearch_nl.c PENCODE_FILES=${BASE_ENCODER_FILES} main_pencode.c PENCODE_NL_FILES=${BASE_ENCODER_FILES} main_pencode_nl.c DEBUG_FILES=${BASE_FILES} main_debug.c all: bwtsearch psearch psearch_nl pencode pencode_nl bencode clean: rm psearch psearch_nl bwtsearch pencode pencode_nl bencode bwt_debug bwtsearch: ${BWTSEARCH_FILES} gcc -o bwtsearch ${BWTSEARCH_FILES} bencode: ${BENCODE_FILES} gcc -o bencode ${BENCODE_FILES} psearch: ${PSEARCH_FILES} gcc -o psearch ${PSEARCH_FILES} psearch_nl: ${PSEARCH_NL_FILES} gcc -o psearch_nl ${PSEARCH_NL_FILES} pencode: ${PENCODE_FILES} gcc -o pencode ${PENCODE_FILES} pencode_nl: ${PENCODE_NL_FILES} gcc -o pencode_nl ${PENCODE_NL_FILES} debug: ${DEBUG_FILES} gcc -o bwt_debug ${DEBUG_FILES} 

ниже – вывод консоли 🙂

 gcc -o bwtsearch bwtsearch.c bwtsearch.h bwttext.c bwttext.h chartable.c chartable.h common.h occtable.c occtable.h plset.c plset.h strbuf.c strbuf.h main_bwtsearch.c clang: error: cannot specify -o when generating multiple output files make: *** [bwtsearch] Error 1 

Не должно быть необходимости помещать файлы заголовков в список файлов, которые нужно скомпилировать, поскольку стилистически правильный файл заголовка не генерирует исполняемый код.

Раньше было так, что в командной строке gcc было небезопасно размещать файлы заголовков, потому что компилятор не добавлял исполняемый контент в выходной файл в результате parsingа и компиляции заголовка. Однако, поскольку gcc версии 4 или около того и примерно за такое же количество времени для clang, файлы заголовков в командной строке скомпилированы в предварительно скомпилированные заголовки для использования на последующих этапах компиляции.

Это означает, что компиляция

 gcc xc yh 

создаст два продукта: исполняемый файл, сгенерированный из xc и предварительно скомпилированный заголовок, сгенерированный с yh .

Gcc (по крайней мере, до версии 6.3) позволяет указать явное имя выходного файла в этом случае, хотя я считаю, что следствием является то, что предварительно скомпилированный заголовочный файл записывается как x а затем перезаписывается исполняемым файлом. (Это не позволяет указывать явное имя вывода в большинстве других случаев, например, когда вы используете параметры -c , -S или -E для создания вывода для каждого входа.) Но clang, возможно, более разумно, создает при явном имени выходного файла с параметром -o и у вас есть более одного выхода, даже если этот вывод является предварительно скомпилированным заголовком (который вы, возможно, не собираетесь создавать).

(Смутно, в Mac OS X, команда gcc обычно вызывает clang-компилятор. Предполагаю, что это нужно, чтобы не нарушать скрипты, которые неправильно полагают, что gcc является общим именем для компилятора C.)

Решение состоит в том, чтобы удалить файлы заголовков из списка файлов для компиляции.