是否可以使用.d文件来编译所有相关的c文件?

时间:2016-07-30 00:37:20

标签: c makefile

我是新来的ifle 我想在我的主要测试某些功能。这个函数在c文件中有很多依赖,我甚至无法跟踪

是否可以使用该.c文件的.d文件来编译我的main以使该函数在我的小应用程序中运行并且.d文件获取所有依赖项?

我在想是否有可能做类似

的事情
<li>

1 个答案:

答案 0 :(得分:1)

您似乎误解了源文件,头文件,目标文件和可执行文件之间的关系。

假设我们有几个功能:

void alpha();
void beta();
void gamma();
void delta();
...

每个都在标头文件alpha.h)中声明,并在源文件alpha.c)中定义。并且假设现在这些功能是独立的;他们不互相打电话。编译其中一个(生成目标文件)很简单:

gcc -c beta.c -o beta.o

(“-cc -oo”只是巧合。-c表示“构建目标文件”,而-o表示“这里是如何命名结果”。)

我们还有一个函数void octopus()可以调用所有这些函数。我们在标题octopus.h

中声明它
// octopus.h
void octopus();

并在源文件octopus.c中定义:

#include "alpha.h"
#include "beta.h"
...
#include "omega.h"

void octopus()
{
  ... // calls alpha(), beta(), etc.
}

生成目标文件很简单:

gcc -c octopus.c -o octopus.o

现在假设我们有一个文件mymain.c,其中包含main()并调用某些函数:

#include "alpha.h"
#include "beta.h"

int main()
{
  alpha();
  beta();
  return 0;
}

构建目标文件mymain.o很简单:

gcc -c mymain.c -o mymain.o

构建可执行文件 mymain稍微困难一些:

gcc mymain.o alpha.o beta.o -o mymain

如果所有这一切都清楚,那么我可以尝试猜测你想要什么。您希望main()调用octopus(),并且您希望Make为您构建可执行文件,即使您不知道列表alpha, beta,... omega ,是吗?

编辑:如果您有文件octopus.d

octopus.o: octopus.c alpha.h beta.h ... omega.h

您可以将其转换为所需目标文件列表:

alpha.o beta.o ... omega.o

通过许多方法中的任何一种。您可以从命令行使用sed:

sed 's/.*\.c //;s/h /o /g' octopus.d

或在makefile中你可以使用Make的文本操作函数:

OBJECTS := $(subst .h,.o,$(filter %.h, $(shell cat octopus.d)))