如何在外部文件中调用外部函数。 C

时间:2018-11-02 20:04:38

标签: c linux

我有一个用C编写的基本库。还有其他外部扩展/定义文件。使用简单的搜索工具,基础库(使用时)可以在目录中搜索扩展库。无需告诉编译器是哪个文件。然后,C程序可以调用该外部文件中的函数。

所以我想在外部文件中运行一个函数。我可以在运行时选择要从哪个文件运行功能。 (例如,我输入该文件在运行时位于./external_file中)(没有编译时间!)。这可能吗?

我需要从函数中读取返回值,我需要等到函数完成后才需要用参数调用函数,并且程序在运行时必须可以选择文件和函数。 / p>

这可能吗?是的,程序文件确实包含函数名称(带有名称)。只需要知道如何在运行时在外部文件中调用该函数。

2 个答案:

答案 0 :(得分:2)

使用动态库-大多数操作系统都提供支持,以给定名称加载库并获取要调用的函数的地址。

在Windows中,请参阅LoadLibrary和ProcAddress。在Linux中,请参阅dlopen和dlsym。

答案 1 :(得分:1)

您可以使用dlopen函数在运行时加载共享库(即.so文件),然后使用dlsym获取要调用的函数。

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

mylib.c:

#include <stdio.h>

void f1(int a)
{
    printf("in f1, a=%d\n", a);
}

int f2(char *s)
{
    printf("in f2, s=%s\n", s);
    return *s;
}

然后将其编译为共享库:

gcc -g -Wall -Wextra -fPIC -c mylib.c
gcc -g -Wall -Wextra -fPIC -o libmylib.so mylib.o

您可以按以下方式调用这些函数:

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

int main()
{
    // get a handle to the shared library
    void *handle = dlopen("./libmylib.so", RTLD_LAZY);
    if (!handle) {
        printf("dlopen failed: %s\n", dlerror());
        exit(1);
    }

    // get a pointer to the function to call
    void (*myf1)(int) = dlsym(handle, "f1");
    if (!myf1) {
        printf("dlsym 1 failed: %s\n", dlerror());
        exit(1);
    }
    myf1(4);

    // get a pointer to another function to call
    int (*myf2)(char *) = dlsym(handle, "f2");
    if (!myf2) {
        printf("dlsym 2 failed: %s\n", dlerror());
        exit(1);
    }
    printf("rval=%d\n", myf2("hello"));

    dlclose(handle);
    return 0;
}

请注意,您需要在编译时知道函数签名的外观,以便可以正确地调用它们。