将多个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