Linker (ln) -Fehler: Bestimmte Dateien können nicht gefunden werden

1047
n0pe

Ich baue etwas von Source und bekomme beim Laufen folgende Ausgabe:

 ... CC libpromises_la-mod_outputs.lo CC libpromises_la-unix.lo CCLD libpromises.la CC cfknow.o CC manual.o CCLD cf-know ./.libs/libpromises.so: undefined reference to `dlerror' ./.libs/libpromises.so: undefined reference to `dladdr' ./.libs/libpromises.so: undefined reference to `dlclose' ./.libs/libpromises.so: undefined reference to `dlopen' ./.libs/libpromises.so: undefined reference to `dlsym' collect2: ld returned 1 exit status gmake[2]: *** [cf-know] Error 1 gmake[2]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src' gmake[1]: *** [all] Error 2 gmake[1]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src' gmake: *** [all-recursive] Error 1 

Ich habe ein bisschen gegoogelt und der Linker scheint bestimmte Dateien nicht zu finden. Ich habe mich nie mit so etwas befassen müssen, daher frage ich mich, ob mir jemand helfen kann, diese Nachricht zu decodieren und Einblick in die Datei zu gewinnen, welche Datei nicht gefunden werden kann und wie ich dem Linker sagen kann, wo er ist.

Ich weiß, dass die Referenz von libpromises.soeiner binären Datei stammt. Wenn ich es in vi öffne, bekomme ich nur Tracht. Soll ich suchen libpromises.h? libpromises.c?

1
Sind Sie sicher, dass Sie die erforderlichen Bibliotheken installiert haben? Es kann ein Fehler aufgrund nicht erfüllter Anforderungen sein. new123456 vor 13 Jahren 1
Ich bin nicht mit C-Programmierung vertraut, daher bin ich mir nicht sicher, was diese Bibliotheken sind und wie ich danach suchen kann. Angenommen, ich habe sie, wie kann ich dem Linker sagen, wo er suchen muss? n0pe vor 13 Jahren 0

1 Antwort auf die Frage

2
new123456

Sie sollten das Makefile bearbeiten und dies schnell erledigen können.

HINWEIS - Dies setzt voraus, dass das Makefile von GNU Autotools erstellt wurde. Laut der Cfengine-Tarball tun sie es.

Öffnen Sie zuerst das Makefile und suchen Sie nach der Flagge LDFLAGS. Es sollte ungefähr so ​​aussehen:

LDFLAGS = -lfoo -lbar

Fügen Sie zu dieser Auflistung -ldl. Dies fügt einen Verweis auf die Dynamic Loading-Bibliothek hinzu.

Kompilieren Sie neu, und der Linker sollte seine Aufgabe erfüllen können.


Die LIBS-Umgebungsvariable ist eine Umgebungsvariable, die angibt, ./configurewelche zusätzlichen Bibliotheken erforderlich sind. Diese wird dann in das Makefile eingefügt (um Ihre Frage zu beantworten, ./configurewird der Linker nicht wirklich ausgeführt - es wird das Makefile erstellt, das gccmit den Parametern ausgeführt wird) kam aus ./configure).

Also verwenden LIBS=-ldl && ./configure.

Das sieht nach einer lustigen Antwort aus, ich kann ein Makefile bearbeiten :) Allerdings muss ich bis Montag warten, um wieder arbeiten zu können. Ich werde posten, wenn ich wieder zur Arbeit komme und dies probiere. n0pe vor 13 Jahren 0
Ich habe es gerade ausprobiert und es hat nicht funktioniert. n0pe vor 13 Jahren 0
@ MaxMackie Versuchen Sie folgendes: `export LIBS = -ldl &&. / Configure '. Riss von [hier] (http://www.linuxquestions.org/questions/linux-software-2/undefined-reference-to-%60dlopen-and-others-679867/). new123456 vor 13 Jahren 1
Wow, ich denke das hat funktioniert. Brillant! Könnten Sie Ihre Antwort bearbeiten und erklären, was die LIBS-Variable tut? Und was genau sagt diese Flagge dem Compiler / Linker? Vielen Dank. n0pe vor 13 Jahren 0