繁体   English   中英

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

[英]How to call external function in an external file. C

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

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

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

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

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

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

您可以使用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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM