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

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

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

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

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

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

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

然后你可以编译如下。

 gcc -c final.c -o final.o 

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

可能你在找这个:

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

但是使用它们归档它总是很好的

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

然后使用-lmy进行链接。

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

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

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

要么

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

尝试使用

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

这个对我有用。

您始终可以将文件传输到GCC:

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

不要忘记指定语言的选项“-xc”,现在无法从文件扩展名中推断出。 您告诉GCC接受来自stdin的输入,并使用单个尾随短划线“ – ”。

请注意,这相当于使用以下内容编译文件“final.c”:

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

 gcc -c -o single.o final.c