生成多个输出文件时无法指定-o

我有一个关于make文件使用gcc的问题,下面是我在makefile中的代码。 我在生成多个输出文件错误时无法指定-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命令行中几乎无害,因为编译器会因解析和编译头而不向输出文件添加可执行内容。 但是,由于gcc版本为4左右,并且对于clang的时间大致相同,命令行上的头文件被编译为预编译头文件,以便在以后的编译步骤中使用。

这意味着编译

 gcc xc yh 

将创建两个产品:从xc生成的可执行文件和从yh生成的预编译头。

在这种情况下,Gcc(至少高达版本6.3)允许您指定显式输出文件名,但我相信结果是预编译头文件被写为x然后被可执行文件覆盖。 (在大多数其他情况下,它不允许您指定显式输出名称,例如当您使用-c-S-E选项为每个输入生成输出时。)但是clang(可能更明智)会产生当您使用-o选项显式输出文件名并且您有多个输出时出错,即使该输出是预编译的标头(您可能不打算生成)。

(令人困惑的是,在Mac OS X上,命令gcc通常会调用clang编译器。我想这是为了避免破坏错误地认为gcc是C编译器的通用名称的脚本。)

解决方案是从要编译的文件列表中删除头文件。