微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确编译和链接gdbus程序

如何解决如何正确编译和链接gdbus程序

我正在尝试学习dbus和Linux上程序的编译/链接。我是从头开始构建和链接应用程序的新手。为此,我在Ubuntu上创建了一个简单的客户端+服务器应用程序,它们通过gdbus进行通信。我正在使用gdbus-codegen工具为dbus接口生成.c和.h文件。我创建了一个名为dbus_interface.xml的示例XML描述文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE node PUBLIC
  "-//freedesktop//DTD D-Bus Object Introspection 1.0//EN"
  "http://standards.freedesktop.org/dbus/1.0/introspect.dtd">
<node> 
    <interface name="org.hello.world">
        <method name="get_magic_number">
            <arg type="i" name="magic_number" direction="out"/>
        </method>
   </interface>
</node>    

并且我正在使用以下命令生成代码

gdbus-codegen --generate-c-code generated_code dbus_interface.xml

生成generate_code.c和generated_code.h文件。我已经在客户端应用程序中包含了generate_code.h头文件,我正在尝试使用以下命令使用gcc进行编译:

    gcc -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include client.c generated_code.c -o client

但是,出现以下错误

generated_code.c:17:12: Fatal error: gio/gunixfdlist.h: No such file or directory
   17 | #  include <gio/gunixfdlist.h>
      |            ^~~~~~~~~~~~~~~~~~~
compilation terminated.

为什么我的系统上不存在该头文件?我在/usr/include/glib-2.0/gio中有gio目录,它包含一堆头文件-但不是gunixfdlist.h。

作为旁注:

  1. 我不是故意在build命令中使用pkg-config以便更好地了解pkg-config在编译过程中会扩展到什么
  2. 我猜我将必须向链接器以及我的build命令提供实际的库位置,但是我想解决首先解决不正确包含问题的问题

解决方法

头文件位于/usr/include/gio-unix-2.0/gio中。如documentation中所述:

请注意,<gio/gunixfdlist.h>属于UNIX专用的GIO接口,因此在使用gio-unix-2.0.pc pkg-config文件时必须使用它。

因此,您应该在项目配置中使用pkg-config,并确保在获取编译标志的调用中包含gio-unix-2.0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。