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

Tot*_*oob 4 c makefile clang

我有一个关于使用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}
Run Code Online (Sandbox Code Playgroud)

以下是控制台的输出:)

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
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 5

不需要将头文件放在要编译的文件列表中,因为在样式上正确的头文件不会生成可执行代码。

过去通常情况下,将头文件放在gcc命令行中几乎是无害的,因为编译器不会通过分析和编译头而在输出文件中添加任何可执行内容。但是,由于gcc版本为4左右,并且使用clang的时间大致相同,因此命令行上的头文件被编译为预编译的头,以供以后的编译步骤使用。

这意味着编译

gcc x.c y.h
Run Code Online (Sandbox Code Playgroud)

将创建两个产品:从生成的可执行文件x.c和从生成的预编译头y.h。

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

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

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