我是新来的ifle 我想在我的主要测试某些功能。这个函数在c文件中有很多依赖,我甚至无法跟踪
是否可以使用该.c文件的.d文件来编译我的main以使该函数在我的小应用程序中运行并且.d文件获取所有依赖项?
我在想是否有可能做类似
的事情<li>
答案 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)))