Linker 如何在另一个.c文件中优雅地包含.c文件
我有一个子文件夹1/submin.cLinker 如何在另一个.c文件中优雅地包含.c文件,linker,include,makefile,header-files,Linker,Include,Makefile,Header Files,我有一个子文件夹1/submin.c { //initialize statements CallFunction1(); } 子文件夹2/submin.c { //initialize statements CallFunction2(); } 等等 在main文件夹中有一个make文件,包括所有子文件夹。如子文件夹1子文件夹2等。主文件夹也有一个main文件.h,其中包含所有函数定义(如CallFunction1和CallFunction2)。我通过实践知道,在.
{
//initialize statements
CallFunction1();
}
子文件夹2/submin.c
{
//initialize statements
CallFunction2();
}
等等
在main文件夹中
有一个make
文件,包括所有子文件夹。如子文件夹1子文件夹2等。主文件夹也有一个main文件.h
,其中包含所有函数定义(如CallFunction1
和CallFunction2
)。我通过实践知道,在.h
文件中定义函数不是一个好主意。因此,我想创建一个新的.h
文件,其中包含所有函数声明(如接口),并将此.h包含在子文件夹中。但我不知道怎么做。有人能帮忙吗。所以最重要的是我不知道如何将新的.h和.C链接起来
这是(BIGDIR/tests/main文件夹/Subfolder1)中的make文件
这是潜艇
#include "Main.h"
{
// do things
CallFunction1(); //this function is defined in Main.h which is in Mainfolder
}
我想以这样一种方式修改它 在
子文件夹1/submin.c中
我可以
#include "NewMain.h"
使NewMain.h
具有所有函数声明和
main.c
仍然拥有所有的函数定义(太旧了main.h
==>NewMain.c
)
Main文件夹中Makefile的当前内容为:
include $(BIGDIR)/tests/make/Makefile.defs
SUBDIRS += subfolder1
SUBDIRS += subfolder2
include $(BIGDIR)/tests/make/Makefile.rules
附言:我无权更改规则。但是我可以在子文件夹中使用主Makefile和Makefile。每个文件(编译单元)都被单独编译(编译成.o文件),然后它们被链接在一起。头文件(new.h)未链接,它们用于原型检查
生成文件:
sources=subfolder1/main.c subfolder2/main.c
objects=$(sources:.c=.o)
all:
gcc $(objects) -o final_binary
%.o: %.c
gcc -c $< -o $@
sources=subfolder1/main.c subfolder2/main.c
对象=$(源:.c=.o)
全部:
gcc$(对象)-o最终\u二进制
%.o:%.c
gcc-c$<-o$@
绝对不能。如果在另一个C文件中包含一个C文件,那就太不优雅了。显示为subfolder1/submin1.C
的代码片段是不可编译的。因此,很难知道你实际拥有什么以及你期望什么。我很确定这不是为C编写代码的方式;在过去的四分之一世纪里,我已经看到了足够多的C代码,可以确信这是您正在设计的一个新颖方案。这并不意味着它就错了,但它需要非常仔细的解释。听起来有点像是在试图避免将每个函数的签名写两次——通常在头中写一次,在定义函数时写一次。对吗?您发布的主makefile(在被删除之前)没有规则,无法生成任何内容。你想让我猜你到底在干什么吗?或者你想告诉我们吗?对不起,我不明白你有什么或者你想去哪里。请仔细阅读。考虑是否可以从现有系统创建SSCCE。听起来有点像是需要将main.h
及其函数定义复制两份。副本1将成为标题;将{…}
中包含的函数体替换为分号。副本2将被制作成一个源文件或多个源文件,每个源文件都将包含从副本1创建的头文件。在绿色字段编码中(没有可使用的旧代码),通常应创建成对的文件:源文件和头文件。标头包含源文件中定义的函数的用户所需的信息(您不会如此笨拙地使用全局变量,是吗?)。标头不应包含只有实现需要的任何内容。标头定义源用户的接口。源文件包括它自己的头(它应该是第一个头)、实现它提供的服务所需的任何内容以及函数定义。
sources=subfolder1/main.c subfolder2/main.c
objects=$(sources:.c=.o)
all:
gcc $(objects) -o final_binary
%.o: %.c
gcc -c $< -o $@