将多个C源文件编译为唯一的目标文件

时间:2013-08-12 08:09:54

标签: c gcc linker

我有一些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编译所有文件以返回单个目标文件(我还想指定其名称)?谢谢。

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

7 个答案:

答案 0 :(得分:14)

您无法将多个源文件编译为单个目标文件。目标文件是单个源文件及其标头(也称为translation unit)的编译结果。

如果要组合编译的文件,通常使用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

答案 1 :(得分:11)

这不是常用的方法,但您可以通过创建包含以下内容的新final.c文件轻松实现所需目标。

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

然后你可以按如下方式编译它。

gcc -c final.c -o final.o

请注意,可能存在问题,读取编译错误,即使每个文件在单独编译时成功编译也是如此。这种情况往往发生在宏定义时,尤其是在以这种方式将源文件合并到一个文件中时。

答案 2 :(得分:5)

可能你正在寻找这个:

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

但是使用

将它们存档总是很好的

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

然后使用-lmy进行链接。

答案 3 :(得分:4)

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

(编辑)后来用编译器选项-flto替换,链接自动取决于编译状态:Requirements to use flto

答案 4 :(得分:0)

要么创建一个final.c,其中包含所有.c个文件,那么您可以使用gcc -c final.c命令编译此最终文件。

另一种方法是使用archive.Build所有文件来获取相应的.o然后归档到一个库中,该库将包含所有这些.o文件。

答案 5 :(得分:0)

尝试使用

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

它对我有用。

答案 6 :(得分:0)

您始终可以将文件传输到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