Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中动态选择库模块的方法_C_Module_Dependencies_C Preprocessor - Fatal编程技术网

在C语言中动态选择库模块的方法

在C语言中动态选择库模块的方法,c,module,dependencies,c-preprocessor,C,Module,Dependencies,C Preprocessor,我想了解一些常用于在C中配置库的模式的信息 我想介绍一些关于图书馆的概念,这样我可以为这个问题提供一些背景知识。这个库是为嵌入式系统设计的,所以我们使用了仔细考虑的方法(以及一些技巧性的不太好的方法)来保持库的轻巧和功能丰富 该库由模块组成,这些模块在很大程度上被设计为尽可能地解耦。有些交叉依赖是必需的,有些是可选的(这是一个重要的注意事项)。我的意思是,当其他模块存在时,一些模块会变得更高级,但是与其强迫用户包含他们不需要的模块(保持较小的占地面积),还可以忽略高级功能。下面是一个很好的例子。

我想了解一些常用于在C中配置库的模式的信息

我想介绍一些关于图书馆的概念,这样我可以为这个问题提供一些背景知识。这个库是为嵌入式系统设计的,所以我们使用了仔细考虑的方法(以及一些技巧性的不太好的方法)来保持库的轻巧和功能丰富

该库由模块组成,这些模块在很大程度上被设计为尽可能地解耦。有些交叉依赖是必需的,有些是可选的(这是一个重要的注意事项)。我的意思是,当其他模块存在时,一些模块会变得更高级,但是与其强迫用户包含他们不需要的模块(保持较小的占地面积),还可以忽略高级功能。下面是一个很好的例子。UART模块有一个UART_Tick方法,需要调用该方法来定期处理传入数据和错误。如果项目中包含了任务(一个简单的调度程序)模块,那么UART模块将调度任务本身,而用户不必再调用UART_Tick函数,而不需要总是担心这一点。然而,为了保持轻松,只有在使用任务模块的情况下才会安排任务

现在让我来解释一下,到目前为止,我是如何摆脱这类事情的,以及为什么我不喜欢它

每个项目都有一个system.h文件。下面是system.h提供的内容

  • 模块配置。例如:

    #define UART1_BAUD 115200
    
    这将UART 1通道配置为波特率为115200。很简单

  • 项目依赖关系示例:

    #include "library.h"
    #include "uart.h"
    #include "system.h"
    
  • 简单地说,这样做是因为它允许用户指定他们需要的模块,并且允许模块使用system.h文件查找配置宏,还可以查找使用的其他模块,以便可以动态更改自身

    下面是我不喜欢的地方:

  • 该库不能与项目分开构建。供我使用 这有点好。但是,如果能够使用make和跨工具链构建工具来简单地构建库并链接到库,那将是非常棒的
  • 预处理过程非常混乱。在这一点上,有一些相互包含对我来说都没有意义,因为一切都包括system.h来获取信息。我知道这很糟糕
  • 这让图书馆的用户感到困惑
  • 它并不能真正解决模块交叉依赖的所有问题,而不会造成问题
  • 我唯一可以使用的其他解决方案是全局预处理器定义。但我也不认为这能完全解决问题。而且它们的配置通常令人毛骨悚然,很容易忘记


    我知道我可能找不到完美的解决方案,但我希望有任何经验/想法/观点能够激发出比我现有的更好的解决方案

    这个问题可能更适合您。您可以使用dlopen/dlsym/dlerror/dlclose函数动态打开共享库并访问库中的函数。@luserdroog在引用其他站点时,指出一种方法可能是构建大量小型库并在链接(或运行)时选择模块,这通常是有帮助的时间您仍然需要为每个目标系统编译库,但是用户可以选择他们想要的模块,而无需重新编译,只需根据他们关心的部分进行链接。