C语言中如何进行动态链接库编程?

  • Post category:C

C语言中进行动态链接库编程,需要经过以下步骤:

1.编写动态链接库的源代码。可使用C语言编写,一般包括函数实现代码和头文件等。

2.编译动态链接库源代码文件,生成动态链接库文件。在Linux系统中使用gcc命令,Windows系统中使用MSVS或者MinGW等工具。

3.在另一个程序中调用该动态链接库的函数。需要先声明动态链接库中函数的原型,之后再进行动态链接库加载、调用函数等操作。

下面是两个示例:

示例一:

动态链接库代码(dylib.c):

#include <stdio.h>

int fun_add(int a, int b) {
    return a + b;
}

int fun_multiply(int a, int b) {
    return a * b;
}

编译命令:

$ gcc -shared -fpic -o libdylib.so dylib.c

上面的命令会生成一个名为libdylib.so的动态链接库文件。

另一个程序中调用动态链接库中的函数,示例代码(link.c):

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

int main(void) {
    void *lib_handle;
    int (*fun_add)(int,int), (*fun_multiply)(int,int);
    char *error;

    lib_handle = dlopen("./libdylib.so", RTLD_LAZY);
    if (!lib_handle) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    fun_add = dlsym(lib_handle, "fun_add");
    if ((error = dlerror()) != NULL)  {
        fprintf(stderr, "%s\n", error);
        exit(EXIT_FAILURE);
    }

    fun_multiply = dlsym(lib_handle, "fun_multiply");
    if ((error = dlerror()) != NULL)  {
        fprintf(stderr, "%s\n", error);
        exit(EXIT_FAILURE);
    }

    printf("fun_add(2,3)=%d\n", fun_add(2, 3));
    printf("fun_multiply(2,3)=%d\n", fun_multiply(2, 3));

    dlclose(lib_handle);
    exit(EXIT_SUCCESS);
}

编译命令:

$ gcc -o link link.c -ldl

示例二:

动态链接库代码(dylib.c):

#include <stdio.h>

void my_print(char *str) {
    printf("%s", str);
}

编译命令:

$ gcc -shared -fpic -o libdylib.so dylib.c

上面的命令会生成一个名为libdylib.so的动态链接库文件。

另一个程序中调用动态链接库中的函数,示例代码(link.c):

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

int main(void) {
    void *lib_handle;
    void (*my_print)(char *);
    char *error;

    lib_handle = dlopen("./libdylib.so", RTLD_LAZY);
    if (!lib_handle) {
        fprintf(stderr, "%s\n", dlerror());
        exit(EXIT_FAILURE);
    }

    my_print = dlsym(lib_handle, "my_print");
    if ((error = dlerror()) != NULL)  {
        fprintf(stderr, "%s\n", error);
        exit(EXIT_FAILURE);
    }

    my_print("Hello, world!\n");

    dlclose(lib_handle);
    exit(EXIT_SUCCESS);
}

编译命令:

$ gcc -o link link.c -ldl

以上两个示例分别演示了动态链接库中函数返回值为整型和无返回值的例子,通过dlopendlsym函数进行动态链接库加载和函数调用。