Linker 如何在另一个.c文件中优雅地包含.c文件

Linker 如何在另一个.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)。我通过实践知道,在.

我有一个子文件夹1/submin.c

{
  //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 $@