C - 具有相同函数和变量名称的库

时间:2021-01-27 21:29:54

标签: c include

我想包含我从源代码构建的两个库。

更详细地说:这些库大体上是相同的,除了一些参数不同并且由a设置

#define Mode *X*

X 描述模式并描述要使用的参数集。例如

对于 x = 2 我想使用

#define N 3
#define Q 4

在一个库中,我的 x 是例如 2,而在其他 3 中,这使得 N 4 和 Q 6 例如

此外,这些库包含相同的函数,这些函数根据设置的模式运行略有不同。

我需要同时包含它们并保持选项打开以使用两个参数集。

任何想法如何正确和干净地实现这一点?整个事情只取决于模式,不幸的是,重命名所有包含的函数和变量是没有选择的。但是我可以访问源代码并且可以进行一些更改。

我尝试构建库并将它们包含在我的主程序中,但显然我有很多命名冲突,并且链接器找到的第一个定义被设置为正确的。

另一个问题是所有的头文件都以e.g.开头

 #ifndef CONFIG
 #define CONFIG

这是标准的并且可以,但是我有两次所有文件,因此只有链接器包含的第一个标头看到它尚未定义,而第二个标头已定义,因此编译器不会执行以下任何代码.

有人知道如何解决这个优雅的问题吗?

我听说过一些关于命名空间的事情,但我不确定这是否适用于 C 以及正确的方法。

BR

1 个答案:

答案 0 :(得分:1)

您可能不得不在运行时加载外部库。

如果您使用的是 Linux,您可以使用 dlopen 在运行时打开一个库,然后使用 dlsym 提取您想要使用的每个变量和函数。

您可以创建一个结构体,其中包含指向库实例的变量和函数的指针,然后为库的每个变体填充该结构体的副本。从那里,您将使用来自适当结构实例的函数指针来调用特定的库函数。

例如,假设您有以下库文件:

x2.c:

#include <stdio.h>

void foo()
{
    printf("in x2 foo\n");
}

x3.c

#include <stdio.h>

void foo()
{
    printf("in x3 foo\n");
}

这些分别编译成libx2.so和libx3.so。那么你的主要来源可以这样做:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

struct lib {
    void (*foo)(void);
};

int main(void)
{
    struct lib lib2;
    struct lib lib3;

    void *l2 = dlopen("./libx2.so", RTLD_NOW);
    if (!l2) {
        printf("dlopen x2 failed: %s\n", dlerror());
        exit(1);
    }
    void *l3 = dlopen("./libx3.so", RTLD_NOW);
    if (!l3) {
        printf("dlopen x3 failed: %s\n", dlerror());
        exit(1);
    }

    lib2.foo = dlsym(l2, "foo");
    lib3.foo = dlsym(l3, "foo");

    lib2.foo();
    lib3.foo();

    dlclose(l2);
    dlclose(l3);
    return 0;
}

输出:

in x2 foo
in x3 foo
相关问题