如何访问在 c 中的 .so(共享库)中声明的用户定义数据类型
How to access user defined data types declared in .so (shared libraries) in c
我有一些外部 .so 文件。我正在编写一个程序来调用 .so 库的一些 API。
我使用了如下的 dlopen 和 dlsym
void *handle = dlopen ("/new_project/lib/Test_external.so", RTLD_LAZY);
void (*fptr)(char *);
fptr = dlsym((void *) handle, "func1");
(fptr)("module_name");
我能够调用 func1(char *)
但是我不确定如何调用 api,它需要 .so 文件中定义的结构对象。例如
func2(structure1 obj1);
甚至尝试使用 RTLD_NOW 来使用 dlopen | RTLD_GLOBAL。没有任何效果。
在此感谢任何帮助。
C 没有 runtime-dynamic 类型。假设您知道在 write/build 您的程序时将加载什么库,或者甚至只知道它在其 public 接口中使用的类型,您可以包含适当的 headers 来声明这些类型。
如果您不知道,动态类型的数据仅通过引用传递(例如使用 void *
指针),那么如果库为您提供了某种类型的描述,请访问运行时(例如 table 的成员、它们的类型和它们的偏移量)然后您可以 malloc
存储这样的 object 并使用该信息动态构建它并将其传递给库。
如果库需要按值传递的动态类型,那么您要处理的 外部函数接口 超出了您在 C 中可以使用 dlopen
执行的范围单独使用,并且您需要一个支持您关心的 C 实现的 FFI 实现,例如 libffi
,它可以动态构造和进行调用。
我有一些外部 .so 文件。我正在编写一个程序来调用 .so 库的一些 API。
我使用了如下的 dlopen 和 dlsym
void *handle = dlopen ("/new_project/lib/Test_external.so", RTLD_LAZY);
void (*fptr)(char *);
fptr = dlsym((void *) handle, "func1");
(fptr)("module_name");
我能够调用 func1(char *)
但是我不确定如何调用 api,它需要 .so 文件中定义的结构对象。例如
func2(structure1 obj1);
甚至尝试使用 RTLD_NOW 来使用 dlopen | RTLD_GLOBAL。没有任何效果。
在此感谢任何帮助。
C 没有 runtime-dynamic 类型。假设您知道在 write/build 您的程序时将加载什么库,或者甚至只知道它在其 public 接口中使用的类型,您可以包含适当的 headers 来声明这些类型。
如果您不知道,动态类型的数据仅通过引用传递(例如使用 void *
指针),那么如果库为您提供了某种类型的描述,请访问运行时(例如 table 的成员、它们的类型和它们的偏移量)然后您可以 malloc
存储这样的 object 并使用该信息动态构建它并将其传递给库。
如果库需要按值传递的动态类型,那么您要处理的 外部函数接口 超出了您在 C 中可以使用 dlopen
执行的范围单独使用,并且您需要一个支持您关心的 C 实现的 FFI 实现,例如 libffi
,它可以动态构造和进行调用。