我有一些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
编译所有文件以返回单个目标文件(我还想指定其名称)?谢谢。
也许有另一种更常见的方法,在这种情况下请告诉我。
答案 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