c - 如何在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。没有任何效果。
任何帮助在这里表示赞赏。
解决方案
C 没有运行时动态类型。假设您知道在编写/构建程序时将加载哪个库,或者甚至只知道它在其公共接口中使用的类型,您可以包含适当的标头来声明这些类型。
如果您不知道,但是动态类型的数据仅通过引用传递(例如使用void *
指针),那么如果库在运行时向您提供了某种类型的描述(例如成员表,它们的类型,以及它们的偏移量)然后您可以malloc
存储这样的对象并使用该信息动态构建它并将其传递给库。
如果库需要按值传递的动态类型,那么您正在处理的外部函数接口超出了您可以在 C 中dlopen
单独使用的范围之外,并且您需要支持您关心的 C 实现的 FFI 实现,libffi
例如可以动态构造和调用。
推荐阅读
- python - 如何在点击时获得最近的 tkinter 画布元素?
- ag-grid - 默认定义 columnDefs
- javascript - 创建一个在计时器上运行的数字序列函数
- java - JAVA 反射将对象转换为由特定超类型名称给出的类
- elasticsearch - 如何对复合聚合中的术语聚合的文档计数进行排序?
- python - 通过一组槽尽可能均匀地分配整数数量
- openssl - 使用 OpenSSL 如何针对一个证书(而不是整个链)验证时间戳令牌
- fortran - 除以零时的无穷大符号
- reactjs - Material UI Grid 组件将第二列填充到容器末尾
- java - 具有多线程和实例共享的泛型