【问题标题】:shared library plugin and calling functions from main program (Bluez)共享库插件和从主程序调用函数(Bluez)
【发布时间】:2014-04-25 08:38:33
【问题描述】:

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

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

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

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

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 linux shared-libraries bluetooth-lowenergy bluez


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。那么创建 GATT 配置文件呢,你知道怎么做吗?
    • 我浏览了 Bluez 5.18 的源代码,也找到了 gatt-exmaple.c。击败我这应该如何作为插件工作。我发现了一个日志条目,在 3.x 版本中,它们未导出插件不需要的符号。也许这个例子已经被那个改变打破了。您可能应该使用一堆公共 API 函数而不是 gatt_service_add。但不清楚是哪些。最好与维护人员联系/在 Bluez 开发人员邮件列表上发帖。
    【解决方案2】:

    目前,您无法在 Bluez 5.18(也在 5.19 中)将 BLE GATT 配置文件创建为外部插件,只能使用内置插件

    Bluez mailing list

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多