生成多个输出文件时无法指定-o [C错误]

时间:2017-04-20 16:52:09

标签: c makefile clang

我有一个关于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

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编译器的通用名称的脚本。 )

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