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

     2023-04-14     99

关键词:

【中文标题】如何正确编译和链接 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)

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

】设置Eclipse链接器以编译和运行GLFW应用程序-如何?【英文标题】:SetupeclipselinkertocompileandrunGLFWapplications-Howto?【发布时间】:2014-04-2103:05:18【问题描述】:基于this问题,我能够为GLFW库制作一个默认的cmake编译,编译我的GLFWApp... 查看详情

程序如何运行?编译链接装入?

...;选择「星标公众号」一起进步!一、地址概念和程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在... 查看详情

如何在 Visual Studio 2008 Express 中获得一个最小的 SDL 程序来编译和链接?

】如何在VisualStudio2008Express中获得一个最小的SDL程序来编译和链接?【英文标题】:HowdoyougetaminimalSDLprogramtocompileandlinkinvisualstudio2008express?【发布时间】:2008-12-2814:03:48【问题描述】:我正在尝试在VisualStudio2008Express中使用C++中的... 查看详情

学习笔记链接

...者不兼容的版本引起的链接器错误。除非你理解链接器是如何解析引用、什么是库以及链接器是如何使用库来解析引用的,否则这类错误将令你感到迷惑和挫败。理解链接器将帮助你避免一些危险的变成错误。Linux链接器解析符... 查看详情

dbus c:啥绑定(gdbus?)和客户端/服务器简单示例

...】:2011-12-3007:50:58【问题描述】:我想使用dbus进行应用程序之间的通信(实际上我使用的是localhost套接字)。我正在寻找一个非常基本(但完整/可编译)的工作示 查看详情

编译 OpenCL 应用程序和使用可用编译器选项的正确方法

...器(GCC或Clang):当我们使用编译器时像gcc或clang,我们如何控制这些选 查看详情

交叉编译时如何使用外部库?(代码片段)

...后编译?在这种情况下,最佳做法是什么?我也想知道它如何用于cstdlib。在我的程序中,我使用了stdio函数,它在交叉编译后工作,没有做任何特殊的事情。我刚刚在makefile中为我的armgcc提供了路径。所以,我想知道,它是如何... 查看详情

在 C 和 C++ 中,链接器如何找到具有已实现函数的正确文件?

】在C和C++中,链接器如何找到具有已实现函数的正确文件?【英文标题】:InCandC++,howdoesthelinkerfindtherightfilewiththeimplementedfunctions?【发布时间】:2015-08-2304:38:21【问题描述】:这是我用C编写的代码。我习惯于Java,因此我不明白C... 查看详情

使用 gdbus-codegen 骨架时如何验证 D-Bus 属性

】使用gdbus-codegen骨架时如何验证D-Bus属性【英文标题】:HowtovalidateaD-Buspropertywhenusinggdbus-codegenskeleton【发布时间】:2016-09-2905:44:39【问题描述】:我正在使用gdbus和gdbus-codegen在D-Bus上创建服务。自省是这样的:<!DOCTYPEnodePUBLIC"-/... 查看详情

undefinedreferenceto异常怎么解决

...,比如uuid的什么什么函数,则要检查你的libqte是不是编译得正确.本来这些库应该正确链接到libqte.so上,这样在qtopia链接的时候就不需要显式的加上这些库了. 有的时候libqte没有正确链接好,但是在编译libqte阶段不会报错,到后面qtop... 查看详情

如何在md(d)和mt(d)工程间正确分配和释放动态内存

 MD(d)和MT(d)MD(d)和MT(d)是windows下VC开发的两个编译选项,表示程序的运行时库编译选项。/MT是"multithread,staticversion" 意思是多线程静态的版本,定义了它后,编译器把LIBCMT.lib安置到OBJ文件中,让链接器使用LIBCMT.lib处理外部... 查看详情

如何在命令行中编译和链接项目?

】如何在命令行中编译和链接项目?【英文标题】:howtocompileandlinkprojectincommandline?【发布时间】:2016-11-0410:11:14【问题描述】:使用VisualStudio,我写了一个C++程序MyCat,所以它可以在VSIDE中编译生成一个MyCat.DLL文件。另外,我可... 查看详情

如何使用 gdbus-codegen 使用 org.gtk.GDBus.C.ForceGVariant 注释 xml 文件

】如何使用gdbus-codegen使用org.gtk.GDBus.C.ForceGVariant注释xml文件【英文标题】:Howtoannotateanxmlfilewithorg.gtk.GDBus.C.ForceGVariantusinggdbus-codegen【发布时间】:2019-09-1610:07:59【问题描述】:我正在尝试注释一个xml文件,以便dbus-codegen生成一... 查看详情

MATLAB + Mex + OpenCV:链接和编译正确,但在运行时找不到库

】MATLAB+Mex+OpenCV:链接和编译正确,但在运行时找不到库【英文标题】:MATLAB+Mex+OpenCV:Linksandcompilescorrectlybutcan\'tfindlibraryatruntime【发布时间】:2013-07-1505:35:17【问题描述】:我有一个mex函数,它使用了我正在尝试使用的OpenCV。编... 查看详情

程序如何运行,编译链接装入?

...7;,硬核文章第一时间送达!一、地址概念和程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在... 查看详情

程序如何运行,编译链接装入?

...7;,硬核文章第一时间送达!一、地址概念和程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在... 查看详情

程序是如何运行的——编译链接装入(代码片段)

1、地址概念和程序如何运行在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常都要经过... 查看详情

在gjs中使用GDBus调用DBus方法,没有输出?

...扩展,其中涉及到gjs中的一些dbus调用。我了解到Gio.DBus是正确使用的模块,但我未能使其正常运行。为了说明我的意思,我准备了以下“不正确”的代码,它试图调用org.freedesktop. 查看详情