【发布时间】:2019-05-29 11:55:37
【问题描述】:
我正在尝试在我自己的 C 程序中重新使用 BlueZ 代码来管理蓝牙连接并遇到编译问题。
当我进一步分析问题时,我认为这是正在发生的事情:
这一切都归结为我的程序结构:
1.myadv.c includes myadv.h includes gio.h
2. myadv.c includes "gdbus.h" (Helper lib)
现在的问题是 gdbus.h 的某些符号定义(typedef、方法等)与 gio.h 中的内部定义冲突
因此我得到如下编译器错误:
/usr/include/glib-2.0/gio/gioenums.h:1383:3: error: conflicting types for ‘GDBusSignalFlags’
} GDBusSignalFlags;
^~~~~~~~~~~~~~~~
conflicting types for ‘g_dbus_proxy_new’
void g_dbus_proxy_new
在包含期间避免此类符号冲突错误的最佳做法是什么?请注意,我需要同时使用这两个头文件:
- gio.h(gnome 库)
- gdbus.h(直接从 BlueZ 借来的 dbus 助手)
【问题讨论】:
-
是否可以对代码进行分区,以便一个文件包含
gio.h,另一个包含gdbus.h,但两者都不包含?那将是最干净的解决方案。希望当您尝试链接结果时不会出现任何符号表冲突。 -
@TomKarzes 这最终可能是不可能的,因为在 adv.c 中我需要进行两个操作。一项操作使用
中的符号,另一项使用 gdbus.h 中的符号。 E -
即使你把它们分成两个文件并以互斥的方式包含库,它们也会间接同时出现在第三个文件中,对吗?
-
@TomKarzes 你还是让我思考。让我看看我能在那个方向做些什么。
-
您似乎有更深层次的问题。毫不奇怪,我发现 BueZ 的源代码使用 glib。这就解释了为什么你的两个标题依赖于一些相同的符号。但是符号定义不匹配意味着它们使用了不同版本的glib。除非您能调和这种差异,否则这不太可能结束。