2017-05-30 4 views
2

Ich baue ein C++ Projekt auf meinem Ubuntu 64bit System mit einem bereitgestellten Makefile, und dieses Projekt bietet auch eine API-Bibliothek für Entwickler.Suche nach "undefinierten" Referenzen in einem C/C++ Projekt

Die Kompilation erfolgreich war, keine Fehler überhaupt, aber wenn ich versuche, in meiner Dateien die API-Bibliotheken in der „api“ Ordner vorgesehen sind, g++ klagt dann über undefinierte Referenzen.

Es ist kein Problem mit Abhängigkeiten (ich habe das Projekt bereits erfolgreich erstellt), in der Tat sind die fehlenden Referenzen über Klassen und Funktionen, die vom Projekt bereitgestellt werden, aber sie sind in bestimmten (Sub-) Ordnern Ich weiß, in welchen .so Dateien und g++ sie nicht finden, wahrscheinlich weil sie nicht wissen, dass sie sich in diesen spezifischen Unterordnern befinden. Ich glaube, ich bin etwas fehlt oder ich tue etwas falsch in der Regel, wenn sie versuchen, die Bibliotheken in einem Projekt zu nutzen

Es ist nicht das erste Mal, dies geschieht, wenn APIs von jedes Projekt zu verwenden versuchen, dann.

Insbesondere das Hauptproblem ist, dass ich weiß nicht, wie man den Compiler zu sagen, wo einige Klassen oder Datenstrukturen deklariert sind, und darüber hinaus weiß ich nicht, wie zu finden sie, um zu wissen, wo sie sind.

Regel eine Abhilfe, die ich dieses Problem zu vermeiden verwenden ist make install (als root oder mit sudo) zu laufen, so dass Bibliotheken und APIs in Standardordnern installiert sind (wie /usr/include oder /usr/lib) und wenn ich diesen thend tun kann ich schließen die API-Bibliotheken verwenden #include <library>, aber in diesem letzten Fall hat es auch nicht funktioniert, weil vielleicht einige erforderliche Dateien mit den nicht gefundenen Klassen/Strukturen nicht richtig in den richtigen Ordnern im System installiert sind.

Eine andere Problemumgehung, die ich manchmal verwendet, ist zu versuchen, alle Projektdateien in den gleichen Ordner zu legen, anstatt die Projektordnerstruktur zu verwenden, aber das ist eindeutig nicht gut! :-)

Aber ich bemerkte, dass einige andere Leute die APIs verwenden, verwaltet dann anscheinend sie einen Weg zu finden, um die Dateien, die „undefiniert“ Referenzen und sie in der Zusammenstellung wissen enthalten.

Dann meine allgemeine Frage ist: gegeben ein „klassisches“ C++ Projekt basierte auf „Makefile“ Dateien und mit üblichen Ordnernamen wie src, lib, build, bin usw., wenn ich will, C++ Dateien schreiben mit die vom Projekt bereitgestellten Bibliotheken, aber der Compiler beschwert sich über undefinierte Referenzen, Wie kann ich die Dateien (.so oder .o oder .cpp) finden, die solche Referenzen enthalten? Gibt es ein Werkzeug, um sie zu finden? Und Wie kann ich dem Compiler sagen, wo sie sind? Sollte ich eine Befehlszeilenoption für g++ verwenden oder sollte ich das Makro #include auf eine clevere Weise verwenden?

PS Ich habe auch versucht, das pkc-config Linux-Tool zu verwenden, um richtige Optionen für die Kompilierung zu bekommen, und sie waren verfügbar, aber der Compiler beschwert sich immer noch über die undefinierten Referenzen.

Einige weitere degails über das Projekt habe ich versucht:

Für interessierte Personen einen Link zum Projekt unter: https://github.com/dreal/dreal3

Und Anweisungen, wie es zu bauen: http://dreal.github.io/download/

+0

Ich in der Regel nur STRG + UMSCHALT + F und kopieren Sie und fügen Sie den Namen des Symbols, dass der Compiler beschwert über die findet mich das Symbol. Jede IDE sollte einige Funktionen haben, um nach Symbolen zu suchen, aber im Notfall [find/grep] (https://stackoverflow.com/questions/8144501/grep-l-is-not-working-for-a-folder-with -sub-folders # 8144580). – nwp

+0

Meiner Erfahrung nach ist dies völlig projektabhängig. Sie müssen den Projekt-Build-Prozess ein wenig steigern, dann nach dem fehlenden Teil suchen und Backwords verwenden, um herauszufinden, wie darauf zugegriffen werden soll. find/grep ist dreckig und rohe Gewalt und manchmal der beste Startpunkt. Suchen Sie nicht nur nach/grep, sondern auch nach ack. https://beyondgrep.com/ – Richard

+0

ctags generiert eine TAGS-Datei, die den Speicherort der Definition für jedes Symbol angibt. – stark

Antwort

2

Sehen Sie sich die Link-Option -rpath an - speziell mit dem Argument "$ ORIGIN". Dadurch können Sie Bibliotheken relativ zu Ihrem ausführbaren Speicherort finden, sodass Sie sie nicht an den Standardstandorten installieren müssen, sondern sie nur an einer bekannten Stelle relativ zur ausführbaren Datei platzieren müssen. Das sollte dir mit einem Teil des Puzzles helfen.

Hinweis: -Wl, kann verwendet werden, um Argumente über g ++ an den Linker zu übergeben.

Wie für den Hinweis der Compiler/Linker in einer Bibliothek, so dass es undefinierte Referenzen durch diese Bibliothek lösen kann, verwenden Sie die -l (das ist kleines L) Option den Namen der Bibliothek angeben und -L Verzeichnisse angeben, für Bibliotheken zu suchen.

Was in einer Bibliothek suchen (.so-Datei), um zu sehen, was Symbole drin sind, haben Sie ein paar Werkzeuge zur Verfügung: objdump, nm, readelf und objcopy.

+0

Hallo Jesper, vielen Dank! Du meinst, ich sollte das LD-Tool manuell statt automatisch (über g ++) verwenden? und wann sollte ich es benutzen? Beim Erstellen des Projekts oder beim Kompilieren meiner Dateien, die die Projektbibliotheken verwenden? Können Sie sich ein Beispiel vorstellen, das Sie in einem hypothetischen Projekt ausführen würden? - –

+0

Die Verwendung dieser Optionen über g ++ ist in Ordnung. Sehen Sie in der g ++ - Dokumentation nach, wo Sie genau hinschauen sollten. –

+0

Vielen Dank Jesper, ich werde es in den nächsten Stunden versuchen –