nginx 在翻译单元之间共享静态链接

vuktfyat  于 2022-11-02  发布在  Nginx
关注(0)|答案(1)|浏览(150)

我正在实现一个C项目,要在一个更大的C项目中编译。我有一个很大的.c文件(没有头文件),我最近在其中添加了一些内容。这些内容的目的在逻辑上与大的C文件是分开的。我想将其拆分为两个.c文件,以便更好地维护。然而,我面临着一个复杂的问题。
虽然在逻辑上是可以分离的,但这些理论上分离的单元(.c文件)必须共享一些静态函数和原始文件中的声明。当试图创建一个头文件来包含公共依赖项(这是公共过程)时,我遇到了困难,因为以下原因(以及我所尝试的)。

  • 我的代码被埋在一个更大的项目中,它有一些和我的代码相同的定义,这就是为什么它们最初是静态声明的原因。它是这样工作的,但是当我试图拆分c文件并创建头文件时,我不得不删除其中一些文件中的static关键字(为了不获取错误undefined引用),但这导致了多个声明错误,因为与更大的项目冲突(预期但令人沮丧)。
  • 我不能更改这些函数和结构的命名,因为它们对于与外部项目一起工作是严格的。
  • 如果头文件中的声明是静态的,而c文件中的定义不是静态的,我对会发生什么感到困惑。无法确定这是否会导致冲突(理论上应该是这样?)
  • 我不想在分离的文件中重复静态的公共依赖关系,这只涉及到制作代码的副本,与我简化维护的目的相矛盾。

我想它归结到是,我可以创建这样一个头文件或文件,链接(导出符号)只对导入该头文件的c文件可见,而不是从其他翻译单元.这是要求这些单元,我创建可以看到对方的定义(因为头文件只包括他们).
即使当我问它的时候,它似乎是不可能的,但是我可能是从一个错误的观点来处理这个问题的,我也想知道。我正在尝试做的是不可能的,我应该把它作为一个单一的文件吗?
如果有用的话,我正在为Nginx Web服务器开发一个模块。

hfyxw5xn

hfyxw5xn1#

在极少数情况下,包含.c文件是有意义的。
首先,您有两个.c文件,例如module1.c和module2.c。然后创建名为mylibrary.c的第三个文件,其中仅包含以下内容:


# include "module1.c"

# include "module2.c"

并编译 just mylibrary.c。虽然这意味着您无法通过单独编译模块来减少编译时间,但您仍然可以在不同的.c文件中逻辑分离函数,同时只导出所需的函数。
对于需要在子模块之间共享的静态函数,请为这些函数创建单独的标头以包含在每个子模块中。
例如:
模块1_权限. h:

static void mod1_internal1(void);
void mod1_external1(void);

模块2_权限. h:

static void mod2_internal1(void);
void mod2_external1(void);

模块1.c:


# include "module1_priv.h"

# include "module2_priv.h"

static void mod1_internal1(void)
{
    // do something
}

void mod1_internal2(void)
{
    // do something
}

模块2.c:


# include "module1_priv.h"

# include "module2_priv.h"

static void mod2_internal1(void)
{
    // do something
}

void mod2_internal2(void)
{
    // do something
}

相关问题