【问题标题】:How to link glib-2.0 library for c/c++ program to compile如何链接 glib-2.0 库以供 c/c++ 程序编译
【发布时间】:2018-03-16 01:59:30
【问题描述】:

我是使用 DBUS 的新手,想编译一个使用 glib-2.0 的程序。

但是我得到一个错误。这是我调用 make 的输出:

g++ -I. -Wall -std=c++11 main.c `pkg-config --cflags --libs glib-2.0 dbus-1 
dbus-glib-1` -o main.o
main.c: In function ‘int main(int, char**)’:
main.c:12:15: warning: variable ‘client’ set but not used [-Wunused-but-set-variable]
GDBusClient *client;
           ^
/tmp/ccNkl0Zc.o: In function `main':
main.c:(.text+0x20): undefined reference to `g_dbus_setup_bus'
main.c:(.text+0x44): undefined reference to `g_dbus_client_new'
collect2: error: ld returned 1 exit status
makefile:9: recipe for target 'main.o' failed

make: *** [main.o] 错误 1

我尝试按照 gnome.org https://developer.gnome.org/glib/stable/glib-compiling.html 上的说明进行操作

这是我的制作文件:

CC=g++

CFLAGS=-I. -Wall -std=c++11 \
       -I/usr/include/dbus-1.0 \
       -I/usr/lib/arm-linux-gnueabihf/dbus-1.0/include/ \
       -I/usr/lib/arm-linux-gnueabihf/glib-2.0/include \
       -I/usr/include/glib-2.0


 OBJ = main.o

 default: program

 main.o: main.c hello.h
   $(CC) $(CFLAGS) main.c `pkg-config --cflags --libs glib-2.0` -o main.o

program: $(OBJ)
   $(CC) $(OBJ) $(CFLAGS) -o program 


clean:
  -rm -f main.o
  -rm -f program

这是我的主要内容:

#include <cstddef>
#include <cstdio>
#include <iostream>
#include <glib.h>
#include <dbus/dbus.h>
#include <gdbus/gdbus.h>

static DBusConnection *dbus_conn;

int main(int argc, char * argv[]){
     GDBusClient *client;

     dbus_conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);

     client = g_dbus_client_new(dbus_conn, "org.bluez", "/org/bluez");
     return 0;
}

为什么我会收到对这些调用的未定义引用?

【问题讨论】:

  • 当您使用pkg-config 时,为什么还要在CLFAGS 中硬编码-I
  • 我最初没有使用pkg-config,所以我从未更改过我的CFLAGS 我不认为这是导致问题的原因。
  • 也许不是,但如果pkg-config 返回的路径不一样,也不是那么正确。错误信息是什么?是抱怨未定义的引用还是抱怨找不到.so 文件?
  • 它似乎没有抱怨 .so 文件。我添加了终端输出的图像。我还将`CFLAGS`更改为:CFLAGS=I. -Wall -std=c+11。仍然出现同样的错误。
  • 请不要张贴输出的图片,复制并粘贴到您的问题中。我无法从图片中进行文本选择。从我看到的快速谷歌搜索来看,人们也在pkg-config 行中使用dbus-1 dbus-glib-1。尝试添加这两个。

标签: c++ c glib dbus gdbus


【解决方案1】:

必须为我的系统稍微简化一下,但这对我有用:

main.o: main.c
        $(CC) $(CFLAGS) main.c `pkg-config --cflags glib-2.0` -c -o main.o

program: $(OBJ)
        $(CC) $(OBJ) $(CFLAGS) `pkg-config --libs glib-2.0` -o program

第一个变化是main.o这一代。你没有-c 标志,所以main.o 是一个完整的程序。

第二个变化是编译时只使用cflags,链​​接时使用ldflags。我运行 ldd 时有 glib 库:

ldd program 
    linux-vdso.so.1 (0x00007ffd489ae000)
    libglib-2.0.so.0 => /usr/lib64/libglib-2.0.so.0 (0x00007fc29cf4a000)
    libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/7.3. /libstdc++.so.6 (0x00007fc29cb45000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fc29c83d000)
    libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/libgcc_s.so.1 (0x00007fc29c626000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fc29c277000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fc29c005000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc29bde5000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc29d25d000) [/tmp/glib] pkg-config --libs glib-2.0

【讨论】:

  • 与您的问题无关,但有一个扩展名为“.c”的 C++ 文件很奇怪。我建议将其重命名为 C++ 文件使用的更常见的扩展名(例如 cpp 或 cxx)。
  • 嗨,斯蒂芬,感谢您解决这个问题。我做了你推荐的。但是我仍然遇到同样的错误。然而,我确实在“bluez”下找到了一个名为“bluetooth-player”的程序,该程序已经编译,它使用 glib 和 dbus,当使用命令“ldd bluetooth-play”时,我得到了与你类似的输出。
  • 那时我可能简化了太多 :) (我没有gdbus.h,并且由于您的错误是缺少库,我认为它在链接器步骤中)。您可能需要做一些研究来弄清楚提供缺失符号的正确库是什么(也许它与提供的标题一起提供)。一旦你有了它,将它添加到链接行,比如-lgdbus(猜测库名称)。
  • 所以我是个白痴,但刚刚意识到您可能可以使用ldd 来缩小库的范围。检查链接 bluetooth-player 的库,因为其中有一个库包含您缺少的符号。
  • 谢谢斯蒂芬,我会看看。我确实有 gdbus.h 文件,以及我从 bluez 获得的相关文件的目录。我浏览了 bleuz 用于构建蓝牙播放器的 Makefile 以及其他程序。我找到了这条线:tools_bluetooth_player_LDADD = gdbus/libgdbus-internal.la \ -lglib-2.0 -ldbus-1 -lreadline。这意味着什么?
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多