【问题标题】:cannot specify -o when generating multiple output files [C error]生成多个输出文件时无法指定 -o [C 错误]
【发布时间】:2017-04-20 16:52:08
【问题描述】:

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

【问题讨论】:

  • 错误信息是什么?
  • “生成多个输出文件时不能指定-o”。有趣的是触发错误的命令(make 可能有问题)。
  • @WenhaoQi 能不能复制一下控制台的输出,包括make的输出?不仅是错误信息。谢谢
  • 为什么要编译头文件?
  • @Mat 函数的声明保存在头文件中。

标签: c makefile clang


【解决方案1】:

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

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

也就是说编译

gcc x.c y.h

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

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

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

解决办法是把要编译的文件列表中的头文件去掉。

【讨论】:

  • 我发现 *.gch 文件正在我的一台 Debian 机器上生成,但不知道为什么,但所有内容都在没有警告的情况下编译,所以我添加到 .gitignore 并继续前进。后来,我切换到另一台机器(Darwin),它没有生成 *.gch 文件,但是编译器在相同的代码上出错,说“在生成多个输出文件时无法指定 -o”。这个回答解决了两个谜团!由于许可,Debian 以软件升级缓慢而闻名,因此旧版 gcc 对我的 gcc ... *.h 的处理方式与我 Mac 上的 v4+ gcc 不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多