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

And*_*dry 11 c linker gcc

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

gcc -c src1.c src2.c src3.c -o final.o
Run Code Online (Sandbox Code Playgroud)

我明白了:

gcc: cannot specify -o with -c or -S with multiple files
Run Code Online (Sandbox Code Playgroud)

如果我尝试:

gcc -c src1.c src2.c src3.c
Run Code Online (Sandbox Code Playgroud)

我得到三个不同的目标文件.如何gcc编译所有文件以返回单个目标文件(我还要指定其名称)?谢谢.

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

Som*_*ude 15

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

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

$ ar cr libfoo.a file1.o file2.o file3.o
Run Code Online (Sandbox Code Playgroud)

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

$ gcc file4.o libfoo.a -o myprogram
Run Code Online (Sandbox Code Playgroud)

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

$ gcc file4.o -L. -lfoo -o myprogram
Run Code Online (Sandbox Code Playgroud)

  • @CrouchingKitten不是*编译器*,但*链接器*可能能够进行一些链接时优化,其中可能包括跨TU(转换单元)内联. (5认同)
  • 这意味着gcc不能在不同的源文件中内联函数? (2认同)

Did*_*set 11

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

#include "src1.c"
#include "src2.c"
#include "src3.c"
Run Code Online (Sandbox Code Playgroud)

然后你可以编译如下.

gcc -c final.c -o final.o
Run Code Online (Sandbox Code Playgroud)

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


P0W*_*P0W 6

可能你在找这个:

ld -r src1.o src2.o src3.o -o final.o
Run Code Online (Sandbox Code Playgroud)

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

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

然后-lmy用来链接.


dav*_*vid 5

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

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