【问题标题】:Qt Creator does not find functions inside libraryQt Creator 在库中找不到函数
【发布时间】:2013-08-14 19:43:59
【问题描述】:

我在 Ubuntu 13.04 上尝试使用来自 gsettingsschema.h library 的函数

这是我的 .pro 文件

QT+=core
QT-=gui
TARGET=gsettings_test
CONFIG+=console
CONFIG-=app_bundle

CONFIG+=link_pkgconfig
PKGCONFIG+=gio-2.0

TEMPLATE=app

SOURCES+=main.cpp

pkg-config --libs gio-2.0 报告:

-lgio-2.0 -lgobject-2.0 -lglib-2.0

这对我来说听起来不错。

在我的程序中,我同时使用了 gio/gio.h 和 gio/gsettingsschema.h 库。编译器能够从 gio.h 中找到函数(如 g_settings_new_full()),但无法从 gsettingsschema.h 中找到函数

我收到如下错误:

undefined reference to 'g_settings_schema_source_get_default()'

这里发生了什么?

编辑:完整编译输出(来自 Qt Creator 的报告):

01:46:09: Running steps for project gsettings_test...
01:46:09: Starting: "/usr/bin/qmake" /home/alex/Qt/gsettings_test/gsettings_test.pro -r -spec linux-g++ CONFIG+=debug CONFIG+=declarative_debug CONFIG+=qml_debug
01:46:09: The process "/usr/bin/qmake" exited normally.
01:46:09: Starting: "/usr/bin/make" 
g++  -o gsettings_test main.o   -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lQt5Core -lpthread 
main.o: In function `gsettings_get(QString, QString)':
/home/alex/Qt/build-gsettings_test-Desktop-Debug/../gsettings_test/main.cpp:17: undefined reference to `g_settings_schema_source_get_default()'
/home/alex/Qt/build-gsettings_test-Desktop-Debug/../gsettings_test/main.cpp:17: undefined reference to `g_settings_schema_source_ref(_GSettingsSchemaSource*)'
/home/alex/Qt/build-gsettings_test-Desktop-Debug/../gsettings_test/main.cpp:19: undefined reference to `g_settings_schema_source_lookup(_GSettingsSchemaSource*, char const*, int)'
collect2: error: ld returned 1 exit status
make: *** [gsettings_test] Error 1
01:46:10: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project gsettings_test (kit: Desktop)
When executing step 'Make'
01:46:10: Elapsed time: 00:01.

Libgio 的确切文件名:

/usr/lib/i386-linux-gnu/libgio-2.0.so.0.3600.0

有用的命令:

alex@MaD-pc:~$ sudo ldconfig -v | grep gio
[sudo] password for alex: 
/sbin/ldconfig.real: Can't stat /lib/i686-linux-gnu: No such file or directory
/sbin/ldconfig.real: Can't stat /usr/lib/i686-linux-gnu: No such file or directory
/sbin/ldconfig.real: Path `/lib/i386-linux-gnu' given more than once
/sbin/ldconfig.real: Path `/usr/lib/i386-linux-gnu' given more than once
    libgiomm-2.4.so.1 -> libgiomm-2.4.so.1.3.0
    libgio-2.0.so.0 -> libgio-2.0.so.0.3600.0

【问题讨论】:

  • 链接器调用是什么样的?
  • 您的 gio 库的 确切 版本是什么?可能是你的太旧了。
  • @FrankOsterfeld 那是用于编译的命令:g++ -o gsettings_test main.o -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lQt5Core -lpthread @Greenflow 你又来了 :) 我在 Ubuntu 13.04 上,所以我不认为我的 gio 库是旧的 (i.imgur.com/53b4Nao.png)
  • 嗯,是的..顺便说一句..你的编译器发现你的函数很好。编译完成。链接器是问题所在。意味着他没有找到共享库。或者 lib 太旧并且不包含该功能。也许你给我们更多的编译器输出。只有一个“未定义的引用”很适合阅读,但很难调试。 :-)
  • 问题已更新(我发布了您需要的内容吗?)。

标签: qt ubuntu qt5 glib gio


【解决方案1】:

我知道这已经过时了,但我最近遇到了同样的问题,发现这个问题没有任何真正的答案,终于能够解决它。所以希望这能帮助其他有同样问题的人。

该问题与 C 和 C++ 之间的不同函数名修改有关,因此如果您从 C++ 代码中包含 GLib 文件,您将收到 undefined reference 错误。

解决方案是更改我的包含

#include <gio/gio.h>
#include <glib.h>

extern "C" {
#include <gio/gio.h>
#include <glib.h>
}

之后,编译(和链接!)工作正常。

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多