2016-05-10 27 views
1

Es gibt viele ähnliche Fragen, aber leider haben sie nicht viel geholfen.gcc undefined Verweis auf dbus_ *

Ich versuche Programm von this Post zu bauen, und einen Fehler hat:

$ gcc `pkg-config --libs --cflags dbus-1` hh.c -o hh 
/tmp/ccMabXOg.o: In function `main': 
hh.c:(.text+0x18): undefined reference to `dbus_error_init' 
hh.c:(.text+0x29): undefined reference to `dbus_bus_get' 
hh.c:(.text+0x39): undefined reference to `dbus_error_is_set' 
hh.c:(.text+0x5f): undefined reference to `dbus_error_free' 
hh.c:(.text+0x80): undefined reference to `dbus_bus_name_has_owner' 
hh.c:(.text+0x8f): undefined reference to `dbus_error_is_set' 
hh.c:(.text+0x9f): undefined reference to `dbus_error_free' 
hh.c:(.text+0xfb): undefined reference to `dbus_bus_request_name' 
hh.c:(.text+0x10a): undefined reference to `dbus_error_is_set' 
hh.c:(.text+0x11a): undefined reference to `dbus_error_free' 
collect2: error: ld returned 1 exit status 

Es gibt include <dbus/dbus.h>, und auf dem System vorhanden Datei:

# find/-name "dbus.h" -type f 
/usr/include/dbus-1.0/dbus/dbus.h 

Aber dbus_error_init zum Beispiel vorhanden in dbus-errors.h Datei:

# grep -r dbus_error_init /usr/include/dbus-1.0/dbus/ 
/usr/include/dbus-1.0/dbus/dbus-errors.h:void  dbus_error_init  (DBusError  *error); 

Ich bin kein C-Entwickler und nicht zu sehr vertraut mit gcc und dem Linker, so dass alle Tipps/Links geschätzt werden.

+0

installieren Wenn Sie laufen 'pkg-config --libs --cflags dbus-1 ' allein, was ist die Ausgabe? – fluter

+0

'$ pkg-config --libs --cflags dbus-1 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -ldbus-1' – setevoy

+0

Sie müssen Ihre Anwendung mit der dbus-1-Bibliothek verknüpfen. –

Antwort

1

Ihre Verknüpfungsreihenfolge ist von hinten nach vorne. Statt:

gcc `pkg-config --libs --cflags dbus-1` hh.c -o hh 

tun:

gcc hh.c -o hh `pkg-config --libs --cflags dbus-1` 

oder:

gcc hh.c `pkg-config --libs --cflags dbus-1` -o hh 

In der Verknüpfungssequenz, Dateien, die Symboldefinitionen müssen, bevor die, die kommen müssen, die die Definitionen liefern. So kommen Bibliotheken nach Objektdateien. Wenn es unklar ist, wie dies für Ihre Befehlszeile gilt lesen Sie this question und meine Antwort.

1

Die fehlenden Symbole sind in der Bibliothek dbus-1 definiert. Sie müssen gcc mitteilen, um zu dieser Bibliothek zu verlinken. Wenn die Bibliothek an einem Standardspeicherort auf Ihrem System installiert ist, sollte das Flag -ldbus-1 ausreichen, um dem Linker mitzuteilen, diese Bibliothek zum Auflösen der fehlenden Symbole zu verwenden.

+0

Das wird bereits von 'pkg-config' hinzugefügt. – trojanfoe

+0

Aber anscheinend funktioniert es nicht mit '' 'pkg-config''', da die vom OP erwähnten undefinierten Symbole von libdbus-1.so.3 auf meinem System eindeutig definiert sind. –

+0

Verstanden; aber Sie können (aus dem Kommentar) sehen, dass "-ldbus-1" bereits von 'pkg-config' ausgegeben wird. – trojanfoe

0

Ich versuchte das Beispiel, und es baute für mich.

Zunächst erhalten Sie einen Linking-Fehler und nicht einen Kompilierungsfehler, so gibt es ein Problem beim Suchen Ihrer Bibliothek.

Hier ist meine Bibliothek:

/usr/lib/x86_64-linux-gnu/libdbus-1.so

I Devuan GNU/Linux 1.0 (jessie) renne die Ubuntu ähnlich Debian/ist .

  1. Wie haben Sie Ihre dbus-Bibliothek installiert?

Ich habe mir so:

$ sudo apt-get --reinstall libdbus-1-dev