【问题标题】:Compile multiple C source fles into a unique object file将多个 C 源文件编译成唯一的目标文件
【发布时间】:2013-08-13 11:31:45
【问题描述】:

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

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

【问题讨论】:

标签: c gcc linker


【解决方案1】:

您不能将多个源文件编译成一个目标文件。目标文件是单个源文件及其标头(也称为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

【讨论】:

  • 这意味着gcc不能跨不同的源文件内联函数?
  • @CrouchingKitten 不是 compiler,但 linker 可能能够进行一些链接时优化,其中可能包括跨 TU(翻译单元) 内联。
【解决方案2】:

这不是通常的操作方式,但您可以通过创建具有以下内容的新final.c 文件轻松实现您想要的。

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

那么就可以如下编译了。

gcc -c final.c -o final.o

请注意,可能存在问题,读取编译错误,即使每个文件在单独编译时编译成功。当以这种方式合并您的源文件到单个文件时,这往往会发生,尤其是宏定义和包含。

【讨论】:

    【解决方案3】:

    也许你正在寻找这个:

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

    但是将它们存档总是很高兴,使用

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

    然后使用-lmy链接。

    【讨论】:

    • 不是src1.c src2.c src3.c ld 的源文件,而是src1.o src2.o src3.o object 文件!
    【解决方案4】:

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

    (编辑)后来替换为编译器选项 -flto,根据编译状态自动链接:Requirements to use flto

    【讨论】:

    • 不存在? g++:错误:无法识别的命令行选项“--combine” gcc --version gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
    • 它在 gcc 4.6 中 was removed
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      另一种方法是使用存档。构建所有文件以获取各自的.o,然后存档在一个库中,该库将包含所有这些.o 文件。

      【讨论】:

        【解决方案7】:

        尝试使用

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

        它对我有用。

        【讨论】:

        • 这将生成一个二进制文件,这显然不是问题所要求的(目标文件)。请检查您的答案或将其删除,以免混淆其他人。
        • 这会创建 3 个目标文件,并将它们链接到一个可执行文件中。由于目标文件是独立的,编译器无法内联或以其他方式优化跨模块调用和引用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多