首页 > 解决方案 > 如何在c中访问在.so(共享库)中声明的用户定义数据类型

问题描述

我有一些外部 .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 *)

但是我不确定如何调用需要 .so 文件中定义的结构对象的 api。例如

func2(structure1 obj1);

甚至尝试使用 RTLD_NOW 使用 dlopen | RTLD_GLOBAL。没有任何效果。

任何帮助在这里表示赞赏。

标签: clinuxshared-libraries.so

解决方案


C 没有运行时动态类型。假设您知道在编写/构建程序时将加载哪个库,或者甚至只知道它在其公共接口中使用的类型,您可以包含适当的标头来声明这些类型。

如果您不知道,但是动态类型的数据仅通过引用传递(例如使用void *指针),那么如果库在运行时向您提供了某种类型的描述(例如成员表,它们的类型,以及它们的偏移量)然后您可以malloc存储这样的对象并使用该信息动态构建它并将其传递给库。

如果库需要按值传递的动态类型,那么您正在处理的外部函数接口超出了您可以在 C 中dlopen单独使用的范围之外,并且您需要支持您关心的 C 实现的 FFI 实现,libffi例如可以动态构造和调用。


推荐阅读