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

C-具有相同函数和变量名的库,c,include,C,Include,我想包括两个我从源代码构建的库 更详细地说:这些库通常是相同的,除了一些不同的参数由 #define Mode *X* X描述模式并描述要使用的参数集。例如 对于x=2,我想使用 #define N 3 #define Q 4 等 在一个库中,我的x是示例2,而在另一个库中,我的x是示例2,这使得n4和q6成为示例 此外,这些库包含相同的函数,这些函数根据设置的模式进行操作,差别不大 我需要包括这两个参数,并保持选项打开以使用这两个参数集 如何正确、干净地执行此操作?整个过程只取决于模式,不

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

更详细地说:这些库通常是相同的,除了一些不同的参数由

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

对于x=2,我想使用

#define N 3
#define Q 4

在一个库中,我的x是示例2,而在另一个库中,我的x是示例2,这使得n4和q6成为示例

此外,这些库包含相同的函数,这些函数根据设置的模式进行操作,差别不大

我需要包括这两个参数,并保持选项打开以使用这两个参数集

如何正确、干净地执行此操作?整个过程只取决于模式,不幸的是,重命名所有包含的函数和变量是没有选择的。但我可以访问源代码并可以进行一些更改

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

另一个问题是,所有头文件都以

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

有人知道如何解决这个问题吗

我听说过一些关于名称空间的东西,但我不确定这是否适用于C语言以及正确的方法


BR

您可能需要在运行时加载外部库

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

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

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

x2.c:


关于包含头文件的问题,您可以将
CONFIG
的名称更改为每个头文件更具描述性的名称。例如,如果头文件位于不同的目录中,您可以将目录名前置到常量名,为什么不能使用
#if MODE==2#define n3…
等等?我这样做了,但是如果我构建libs并链接它们,您仍然会有冲突的类型,因为名称仍然是相同的,这肯定是一种方法,但出于我的目的,每次需要库时都无法动态打开它们。有没有办法让一些变量或常量对外部“不可见”?因此,除了一些函数外,库是一个封闭系统,您可以避免冲突?@LykVanDyk您不会每次调用函数时都打开库。您可以在程序开始时执行一次,以填充一组或多组函数(和数据)指针。然后,当需要调用函数时,可以使用以前存储的指针之一。
#include <stdio.h>

void foo()
{
    printf("in x2 foo\n");
}
#include <stdio.h>

void foo()
{
    printf("in x3 foo\n");
}
#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;
}