包含源中的 Qt 未定义参考

Posted

技术标签:

【中文标题】包含源中的 Qt 未定义参考【英文标题】:Qt Undefined Reference at Include Sources 【发布时间】:2015-11-25 06:54:59 【问题描述】:

我对 Qt 环境有一些问题。我只想使用环境 Qt 来控制台应用程序,我正在用 C++ 编写代码,但是 **我必须使用交叉编译器。 **当然我已经在我的 Qt 中正确安装了。

另外我必须使用 dbus-1.6.8。这是重要的条件,因为我向嵌入式系统编写代码,并且库应该与设备中使用的相同。

http://dbus.freedesktop.org/releases/dbus/dbus-1.6.8.tar.gz

我将带有源代码的目录放入我的项目目录并修改 *.pro 文件添加路径

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
INCLUDEPATH += ./dbus-1.6.8  

在此之后,我在 main.cpp 中包含了右主 头文件,其中包括所有下一个必要的头文件

#include <dbus/dbus.h>

接下来我尝试使用这个库

#include <dbus/dbus.h>
main()

DBusError err;   // both values it is OK Qt finds this type
DBusConnection *dbus_conn;

// but below function doesn't find

    dbus_error_init(&err);
    dbus_conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);


我得到错误

 undefined reference to `dbus_error_init'
 undefined reference to `dbus_bus_get_private'
 collect2: error: ld returned 1 exit status

当然上面的函数存在于源目录中我检查了。尽管如此,Qt 并没有找到这些声明。

怎么了?

PS:另外我添加了树目录,当然这不是全部,但最重要的目录是可见的

.
├── bus
├── cmake
│   ├── bus
│   ├── dbus
│   ├── doc
│   ├── modules
│   ├── test
│   │   └── name-test
│   └── tools
├── dbus
├── doc
├── m4

...
....
....

而且只有 dbus 目录

├── dbus
│   ├── dbus-address.c
│   ├── dbus-address.h
│   ├── dbus-arch-deps.h
│   ├── dbus-arch-deps.h.in
│   ├── dbus-auth.c
│   ├── dbus-auth.h
│   ├── dbus-auth-script.c
│   ├── dbus-auth-script.h
│   ├── dbus-auth-util.c
│   ├── dbus-bus.c
│   ├── dbus-bus.h
│   ├── dbus-connection.c
│   ├── dbus-connection.h
│   ├── dbus-connection-internal.h
│   ├── dbus-credentials.c
│   ├── dbus-credentials.h
│   ├── dbus-credentials-util.c
│   ├── dbus-dataslot.c
│   ├── dbus-dataslot.h
│   ├── dbus-errors.c
│   ├── dbus-errors.h
│   ├── dbus-file.c
│   ├── dbus-file.h
│   ├── dbus-file-unix.c
│   ├── dbus-file-win.c
│   ├── dbus.h                          // main header
│   ├── dbus-hash.c
│   ├── dbus-hash.h
│   ├── dbus-internals.c
│   ├── dbus-internals.h
│   ├── dbus-keyring.c
│   ├── dbus-keyring.h
│   ├── dbus-list.c
.....
.....
.....

【问题讨论】:

【参考方案1】:

如果你已经编译了 dbus,你应该得到一个名为 libdbus-1.so 的库。

在您的 Qt .pro 文件中,添加库的路径并链接该库。

例子:

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
INCLUDEPATH += ./dbus-1.6.8  
LIBS += -L./dbus-1.6.8 -ldbus-1

您有更多关于 dbus 和相关库here 的信息。您不需要从源代码编译和安装 dbus。您可以使用 apt-get 安装它。无论如何,这取决于你:)

【讨论】:

在 dbus 目录中,我还发现了这个 libdbus-1.la , libdbus-internal.la 它也是共享库,但可能这不一样。我尝试重新编译它。线LIBS += -L./dbus-1.6.8 -ldbus-1这次给我错误cannot find -ldbus-1,所以这表明我仍然没有这个库。请记住,我需要这个库用于 DIFRENT ARCHITECTURE Thx @Mbed 你安装了库还是编译了它?如果您进入根目录(在您的情况下为dbus-1.6.8),您是否有路径dbus/.libs/?在那个目录中,你应该有我之前所说的 .so。在.pro文件中,LIBS应该设置到正确的目录。 但是那些库在哪里? LIBS 变量必须具有库所在的路径。并且不要在-l之后写lib,只有库名:dbus-1 @Mbded,注意:如果库名称是libdbus-1.so,则不是-libdbus-1,而是-ldbus-1 事件!这不是名称的一部分,而是编译器选项-l! 那么好消息! :) 在我看来,你提到的项目配置不应该是问题,因为如果INCLUDEPATH 正在工作并且项目找到标题,LIBS 也应该工作。真的是./dbus-1.6.8/dbus/.libs 中的库吗?还是在其他子目录(如cmake)中找到了.so?

以上是关于包含源中的 Qt 未定义参考的主要内容,如果未能解决你的问题,请参考以下文章

QT Subdir - 未定义的参考

未定义参考编译MITK/Qt

Qt libao 未定义参考

在 Qt 应用程序中包含 Python.h 会导致对 Qt 函数的未定义引用

子 JSON 对象未定义时未定义

使用 QT 时对构造函数的未定义引用 [重复]