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

Posted

技术标签:

【中文标题】如何正确编译和链接 gdbus 程序【英文标题】:How to properly compile and link a gdbus program 【发布时间】:2020-12-20 20:53:16 【问题描述】:

我正在尝试在 Linux 上学习 dbus 和程序的编译/链接。我对从头开始构建和链接应用程序相当陌生。为此,我在 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 文件。我已经在我的客户端应用程序中包含了 generated_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。

附注:

    我不是故意在构建命令中使用 pkg-config 以便更好地了解 pkg-config 在编译期间扩展为什么 我想我必须将实际的库位置提供给链接器以及我的构建命令,但我想先解决未正确解析包含的问题

【问题讨论】:

学习使用GNU make。您可能缺少包,这些包是特定于您的 Linux 发行版的。我推荐使用Debian 或Ubuntu,但还有很多其他的。见linuxfromscratch.org;阅读GCC 和GDB 的文档并编译所有警告和调试信息gcc -Wall -Wextra -g 您好!我实际上是在使用 makefile 来发出我列出的编译命令。我刚刚提取了给我带来问题的确切命令。感谢您提供的链接 - 我会检查出来!至于 GDB 和调试信息 - 我担心它无济于事,因为我什至无法通过预处理阶段,更不用说编译和调试程序了。 【参考方案1】:

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

注意&lt;gio/gunixfdlist.h&gt;属于UNIX特有的GIO接口,所以在使用的时候需要使用gio-unix-2.0.pc的pkg-config文件。

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

【讨论】:

非常感谢 - 我使用您的回答解决了我的问题。在 CMake 中我使用了 pkg_check_modules(GIO-UNIX gio-unix-2.0 REQUIRED) include_directories($GIO-UNIX_INCLUDE_DIRS) - 不要忘记设置目标链接库:target_link_libraries($PROJECT_NAME $GIO-UNIX_LDFLAGS)

以上是关于如何正确编译和链接 gdbus 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何正确链接/包含 c++ 库

程序编译链接后形成的可执行文件是啥文件

在VS2010的VC++中如何编译、链接、运行、调试程序

设置 Eclipse 链接器以编译和运行 GLFW 应用程序 - 如何?

如何在 AIX 中使用 GCC 编译器链接 *.so 文件

亲测有效无法定位链接器!请检查 toolslink.ini 中的配置是否正确的解决方案