将c源代码编译成obj文件

时间:2013-12-06 11:09:54

标签: c gcc makefile

我有一个关于编译c源文件到obj文件的问题。情况是:我从供应商处获得了一些源代码,从供应商处获得了一些lib,也从供应商处获得了一些obj文件。

makefile也由供应商提供,它使用以下方式定义源:

${BUILD_LIB}_FILES += a.c \
b.c \
c.c

这三个c文件应首先编译成obj文件,然后生成lib文件。但是,供应商没有向我发布c.c文件,例如,它只向我提供c.o,这意味着,我将首先将a.cb.c编译成obj文件,并与c.o一起使用它们来生成lib文件,但makefile是如何完成的?

令人困惑的一点是在makefile中,它已经在列表c.c中应该在编译过程中(它将c.c添加到变量$ {BUILD_LIB} _FILES),但是如果make可以找到有预构建c.o,它不会编译c.c(这意味着我的情况,无论有没有c.c,它编译成功),为什么?根据我的理解,gcc应该编译已经在该变量中列出的所有源文件。

2 个答案:

答案 0 :(得分:0)

make的一个特性是它不会重建已经构建的代码。在您的情况下,将不会编译C源代码文件,因为这些文件已存在目标文件。 make看到它需要构建a.c,b.c和c.c并查找a.o,b.o和c.o.由于供应商提供了a.o,b.o和c.o,因此它不会尝试编译a.c,b.c和c.c,因为它认为它们已经被编译过了。

此功能旨在减少仅更改少量文件时重新编译大型项目所需的时间。非常大的项目可能需要几分钟或几小时或几天来编译,因此这些节省可以很好。

答案 1 :(得分:-3)

gcc command-line所示, -c 选项可用于阻止gcc链接。获得输出后,可以使用 ld 命令获取最终的a.out。

例如:

  

gcc -c -o ab.o a.c b.c

     

ld -o a.out -lc ab.o c.o