如何正确编译和链接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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...