C中的N依赖注入-比链接器定义的数组更好?

C中的N依赖注入-比链接器定义的数组更好?,c,design-patterns,gcc,dependency-injection,linker,C,Design Patterns,Gcc,Dependency Injection,Linker,给定一个库模块,以下称为Runner,它作为可重用组件(无需重新编译,即静态链接库)驻留在体系结构的应用程序分区中,而不是主分区中。请注意,它仅包含用于演示目的的main() 给定一组称为Callables的其他模块/对象(顺序无关),即Callable1、Callable2和Callable3,它们也作为可重用组件驻留在应用程序分区中 Runner在运行时依赖于Callables,因为Runner需要知道这些Callables中的每一个,以便从它们获取数据(访问结构)或让它们执行操作(调用函数

给定一个库模块,以下称为
Runner
,它作为可重用组件(无需重新编译,即静态链接库)驻留在体系结构的应用程序分区中,而不是主分区中。请注意,它仅包含用于演示目的的
main()

给定一组称为
Callable
s的其他模块/对象(顺序无关),即
Callable1
Callable2
Callable3
,它们也作为可重用组件驻留在应用程序分区中

Runner
在运行时依赖于
Callable
s,因为
Runner
需要知道这些
Callable
s中的每一个,以便从它们获取数据(访问结构)或让它们执行操作(调用函数)

运行程序
不应对可调用的
具有编译依赖性。相反,依赖项应通过链接器注入虚拟模块
Callables
。 该概念不仅适用于托管环境,也适用于独立环境。因此,不能使用基于加载程序的机制,如在运行时将
可调用的
加载为共享对象

如何使用链接器注入依赖项? 我的工作解决方案是让
可调用的
在一个专用部分中定义指针,在本例中称为
可调用的
,链接器将收集该部分,以便
运行者可以访问它,在链接时获得必要的信息

可调用的 Callables.h 跑步者c 生成文件 输出 输出表明该解决方案有效,但我对该解决方案不满意与我找到的解决方案相比,使用链接器注入依赖项的其他更好的方法是什么

笔记 环境是x86_64上的GCC/ld,具有
-ffreestanding
,但我非常感兴趣的是,与我目前发现的解决方案相比,这些解决方案不太适合工具链/更易于移植。

什么是分区?什么是架构?我不知道你说的这些话是什么意思。架构是总体的高级设计。根据Robert C.Martin和其他人的说法,它由两个分区组成,应用程序分区和主分区。在应用程序中,所有规则(如遵循实体和包装原则)都适用。main通常很小,将应用程序中的内容粘在一起,我们可能并不总是严格要求用多态性替换
switch
-
case
-语句,并像往常一样避免依赖循环。最重要的是,main依赖于应用程序,但应用程序不依赖于main。
#ifndef CALLABLE_H
#define CALLABLE_H
typedef void (*Callable)(void);
#endif
#ifndef CALLABLES_H
#define CALLABLES_H
#include "Callable.h"
extern Callable Callables_start[];
extern Callable Callables_end[];
#endif
#include "Callables.h"
void Runner_run(void) {
    for (Callable *callables = Callables_start; callables < Callables_end; callables++)
        (*callables)();
}
int main(void) {
    Runner_run();
    return 0;
}
#include <stdio.h>
#include "Callable.h"
static void Callable1_call(void) {
    printf("Callable 1\n");
}
static Callable thisCallable __attribute__((section("Callables"))) = &Callable1_call;
PROVIDE(Callables_start = LOADADDR(Callables));
PROVIDE(Callables_end = Callables_start + SIZEOF(Callables));
CFLAGS+=--std=c99
callables:=Callable1 Callable2 Callable3
.PHONY: all
all: Runner

Runner: Callables.ld Runner.o $(addsuffix .o, $(callables))
$ make -s && ./Runner
Callable 1
Callable 2
Callable 3