c - 共享库插件和从主程序调用函数 (Bluez)

标签 c linux shared-libraries bluetooth-lowenergy bluez

我正在用 C 为 Bluez 5.18 编写插件代码,我想创建自己的 BLE GATT 配置文件作为插件(共享库)。我需要从主代码调用函数,当我编译它时,没有错误,但是在加载插件时,它因 undefined symbol 而崩溃 - 对函数的不满意引用(例如 gatt_service_add)。但是有些函数可以从主程序访问 - 所有函数都带有前缀“btd_”。

当我使用 nm 程序列出主程序中的符号时,前缀为“btd_”的函数是全局符号(列表中的 T 标记),“gatt_service_add”函数是局部符号(列表中的 t 标记)

所以我的问题是,如何在我的插件中使用像“gatt_service_add”这样的函数而不出现 undefined symbol 错误?我在编译时是否缺少一些参数?请注意,我无法更改主程序,因此我只需要针对我的插件的解决方案。仅使用带有“btd_”前缀的函数我不知道如何创建工作自己的 gatt 配置文件等...因此可接受的解决方案也可以仅使用可访问的函数(“btd_”前缀 + 来自/lib 的一些帮助函数)

我用这个参数编译我的插件:

gcc -DHAVE_CONFIG_H -I/usr/include/glib-2.0 -I/usr/include/dbus-1.0 -I/usr/include/bluetooth -I/usr/lib/dbus-1.0/include -I/usr/lib/glib-2.0/include -I"/home/<user>/Workspace/bluez" -O3 -Wall -c -fmessage-length=0 -fPIC -MMD -MP -MF"gatt-example.d" -MT"gatt-example.d" -o "gatt-example.o" "../gatt-example.c"
gcc -Wl,-E -shared -o "bluez-plugin.so"  ./gatt-example.o  /home/<user>/Workspace/bluez/lib/.libs/libbluetooth-internal.a -ldbus-1 -lglib-2.0

最佳答案

局部符号不能被其他模块访问。这就是本地符号的定义。您没有遗漏任何编译器标志,这是不可能的。

关于c - 共享库插件和从主程序调用函数 (Bluez),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23288176/

相关文章:

c++ - 减少所需的 libc 版本

c++ - 第一次读取时文件读取速度较慢,但​​连续读取时速度很快

dll - 使用DLL的优缺点是什么?

macos - 在 Mac osx 中将 .a 转换为 .dylib

c - C 程序中的功能 block 架构

c++ - 一种覆盖文件中少数位置的方法

c - 在 c 中将整数值转换为 float 时出错

C99 如何将简单指针转换为可变长度的多维数组?

Linux 到映射驱动器的符号链接(symbolic link)

c++ - `dlopen` 'ing a .so 包含符号导致 undefined symbol