【问题标题】:compile c source code into obj file将c源代码编译成obj文件
【发布时间】:2013-12-06 11:09:54
【问题描述】:

我有一个关于将 c 源文件编译成 obj 文件的问题。情况是:我从供应商那里得到了一些源代码,从供应商那里得到了一些库,也从供应商那里得到了一些 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 应该编译所有已在该变量中列出的源文件。

【问题讨论】:

  • 您的问题的答案取决于您必须显示的 makefile 的其他内容。

标签: c gcc makefile


【解决方案1】:

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,因为它认为它们已经被编译。

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

【讨论】:

  • 谢谢,我看看如果没有c文件和obj存在,makefile不会编译它
【解决方案2】:

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

【讨论】:

  • 你知道你发布的链接提到-C: Do not discard comments. All comments are passed through to the output file, except for comments in processed directives, which are deleted along with the directive. ...
  • 错误:相关的gcc选项(避免链接)是小写的gcc -cnot -C !!);并且使用gcc -Wall -g -c 很有用....
  • 但我认为对于我的情况,它应该像gcc -c -o a.c b.c c.c,因为所有源文件甚至没有发布给我,都列在变量中
  • @How Chen,很抱歉,但我认为您没有在原始问题中清楚地描述您的意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多