21

我有一些 C 源文件,我正在使用gcc. 我基本上想编译所有这些并创建一个目标文件。当我尝试:

gcc -c src1.c src2.c src3.c -o final.o

我得到:

gcc: cannot specify -o with -c or -S with multiple files

如果我尝试:

gcc -c src1.c src2.c src3.c

我得到三个不同的目标文件。如何告诉gcc编译所有文件以返回一个目标文件(我还想指定它的名称)?谢谢你。

也许还有另一种更常见的方法,在这种情况下请告诉我。

4

7 回答 7

26

您不能将多个源文件编译成一个目标文件。目标文件是单个源文件及其标头(也称为翻译单元)的编译结果。

如果要合并编译后的文件,通常使用以下ar命令将其合并为静态库:

$ ar cr libfoo.a file1.o file2.o file3.o

然后,您可以在链接时使用此静态库,或者直接将其作为目标文件传递:

$ gcc file4.o libfoo.a -o myprogram

或将其作为带有-l标志的库链接

$ gcc file4.o -L. -lfoo -o myprogram
于 2013-08-12T08:17:25.790 回答
12

这不是通常的方法,但您可以通过创建final.c具有以下内容的新文件轻松实现您想要的。

#include "src1.c"
#include "src2.c"
#include "src3.c"

然后你可以编译它如下。

gcc -c final.c -o final.o

请注意,即使每个文件在单独编译时编译成功,也可能存在问题,读取编译错误。当以这种方式将源文件合并为一个文件时,这往往会发生在宏定义和包含中。

于 2013-08-12T08:17:43.333 回答
9

可能你正在寻找这个:

ld -r src1.o src2.o src3.o -o final.o

但是将它们存档总是很好的,使用

ar rvs libmy.a file1.o file2.o file3.o

然后使用-lmy链接。

于 2013-08-12T08:17:13.217 回答
5

要将多个源文件合并到一个目标文件中(至少从 gcc 4.1 开始),请使用编译器/链接器选项 --combine

(编辑)后来替换为编译器选项 -flto,根据编译状态自动链接:使用 flto 的要求

于 2015-05-26T08:25:39.203 回答
2

您始终可以将文件通过管道传输到 GCC:

join file1.c file2.c file3.c | gcc -x c -c -o single.o -

不要忘记指定语言的选项“-x c”,现在无法从文件扩展名中推断出来。您告诉 GCC 接受来自 stdin 的输入,并带有单个尾随破折号“-”。

请注意,这等效于编译具有以下内容的文件“final.c”:

#include "file1.c"
#include "file2.c"
#include "file3.c"

gcc -c -o single.o final.c
于 2017-09-27T06:44:01.753 回答
0

要么你制作一个final.c包含所有文件的文件,然后你可以使用命令.c编译这个最终文件。gcc -c final.c

或者

另一种方法是使用存档。构建所有文件以获取相应.o的然后存档,然后在一个包含所有这些.o文件的库中。

于 2013-08-12T08:18:04.203 回答
0

尝试使用

gcc -o final file1.c file2.c file3.c

这个对我有用。

于 2014-01-19T08:35:06.123 回答