我有一个关于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
答案 0 :(得分:4)
不需要将头文件放在要编译的文件列表中,因为风格正确的头文件不会生成可执行代码。
过去情况是将头文件放在gcc命令行中几乎无害,因为编译器在解析和编译头时不会向输出文件添加可执行内容。但是,由于gcc版本为4左右,并且对于clang的时间大致相同,命令行上的头文件被编译为预编译头文件,以便在以后的编译步骤中使用。
这意味着编译
gcc x.c y.h
将创建两个产品:从x.c
生成的可执行文件和从y.h
生成的预编译标头。
Gcc(至少版本6.3)允许您在这种情况下指定显式输出文件名,但我相信结果是预编译头文件被写为x
,然后被可执行文件覆盖。 (在大多数其他情况下,它不允许您指定显式输出名称,例如当您使用-c
,-S
或-E
选项为每个输入生成输出时。)但是当你使用-o
选项显式输出文件名并且你有多个输出时,clang(可能更明智地)会产生错误,即使输出是预编译的标题(你可能没有'打算生产)。
(令人困惑的是,在Mac OS X上,命令gcc
通常会调用clang编译器。我想这是为了避免破坏错误地认为gcc
是C编译器的通用名称的脚本。 )
解决方案是从要编译的文件列表中删除头文件。