gpt4 book ai didi

c - dlsym() 错误 : ./dynlibrary: undefined symbol: method

转载 作者:太空宇宙 更新时间:2023-11-04 00:06:48 25 4
gpt4 key购买 nike

我有一个我无法解决的问题。查找到目前为止我发现的所有内容。我的问题是,我在我的程序中创建了一个 dyn 库,想要 dlopen 它并从该库中 dlsym 一个方法。

似乎 dlopen 有效,但 dlsym 返回错误“undefined symbol: method

其中“method”是我传递给 dlsym 的方法的名称。

这是我创建库的方式:

execl("/usr/bin/gcc", "gcc", "-fPIC", "-Wall", "-g", "-c", "userinput.c", NULL);

和:

execl("/usr/bin/gcc", "gcc", "-ggdb3", "-shared", 
"-Wl,-soname,libuserinput.so.1", "-o", "libuserinput.so.1.0",
"userinput.o", "-lc", NULL);

这应该可以工作,因为在运行我的代码后有一个库。

我这样打开图书馆:

static void *my_load_dyn (const char *lib) {
static void *handle;
handle = dlopen ("./libuserinput.so.1.0", RTLD_NOW | RTLD_DEEPBIND);
if (handle == NULL) {
printf ("error at dlopen(): %s\n", dlerror ());
exit (EXIT_FAILURE);
}
return handle;
}

/* load func from dyn lib"*/
static void *my_load_func (void *handle, char *func) {
void *funcptr = dlsym (handle, func);
if (funcptr == NULL) {
printf ("error at dlsym(): %s\n", dlerror ());
exit (EXIT_FAILURE);
}
return funcptr;
}

并像这样调用这些函数:

void *libhandle;
void (*userMethod) (unsigned char *d);

libhandle = my_load_dyn(LIBUSERINPUT);
userMethod = my_load_func(libhandle, "testMethod");
(*userMethod)(d);

编辑:这是来自 userinput.c 的代码:

#include <stdio.h>
#include <unistd.h>
void testMethod(unsigned char *d)
{
d[0] = 'Z';
}

在我的程序中生成,在运行程序中编译链接

最佳答案

我可以看到两个可能的问题

  • 代码有问题

    您确定在 userinput.c 中将您的方法 声明为public 函数吗?

    例如如果您的方法被声明为 static,那么它将无法从“外部”访问。还有其他方法可以隐藏函数,使其在库外不可见,但是如果不查看任何代码就无法判断您是否遇到了该问题。

  • 你的库编译/链接坏了

    例如您似乎将头文件 (userinput.h) 链接到生成的库中?

    我建议在问题解决之前使用合适的构建系统,稍后切换到即时编译(例如使用make)

关于c - dlsym() 错误 : ./dynlibrary: undefined symbol: method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com