我有一个用C编写的基本库。还有其他外部扩展/定义文件。使用简单的搜索工具,基础库(使用时)可以在目录中搜索扩展库。无需告诉编译器是哪个文件。然后,C程序可以调用该外部文件中的函数。
所以我想在外部文件中运行一个函数。我可以在运行时选择要从哪个文件运行功能。 (例如,我输入该文件在运行时位于./external_file中)(没有编译时间!)。这可能吗?
我需要从函数中读取返回值,我需要等到函数完成后才需要用参数调用函数,并且程序在运行时必须可以选择文件和函数。 / p>
这可能吗?是的,程序文件确实包含函数名称(带有名称)。只需要知道如何在运行时在外部文件中调用该函数。
答案 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;
}
请注意,您需要在编译时知道函数签名的外观,以便可以正确地调用它们。