2016-07-29 10 views
0

In meinem aktuellen Projekt arbeite ich mit der Arpackpp-Schnittstelle. Die gesamte Bibliothek ist in .h Dateien geschrieben, so dass die Bibliothek nicht kompiliert werden muss. Das Problem, das ich mit Blick auf bin jetzt - wenn ich einige der arpackpp Header-Dateien in einigen meiner Dateien enthalten, die nicht die main.cpp sind, bekomme ich folgende Fehler:"multiple definition of ..." mit arpackpp

/.../Files/Includes/ ../../../arpack++/include/arerror.h:163: Mehrfachdefinition von ArpackError::Set(ArpackError::ErrorCode, std::string const&)' /.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here /tmp/ccruWhMn.o: In function std :: iterator_traits :: iterator_category std :: __ iterator_kategorie (char * const &) ': /.../Files/ Inklusive /../../../ arpack ++/include/arerror.h: 163: mehrere Definition von ArpackError::code' /.../Files/Includes/../../../arpack++/include/arerror.h:163: first defined here /tmp/ccruWhMn.o: In function std :: vector> :: max_size() const ':

für mehr arpackpp Funktionen beim Verknüpfen aller .o Dateien. Wie ich in mehreren Threads gelesen habe, ist das Problem, dass ich eigentlich die Instanziierung der Funktionen einbeziehe, was normalerweise vermieden werden sollte. Da ich nicht die gesamte Bibliothek ändern möchte, habe ich alle Klassen und Funktionen mit arpackpp Klassen in main.cpp, die ziemlich unordentlich wird. Gibt es eine Problemumgehung für dieses Problem? Und warum nicht Wächter (#ifndef...#endif) dieses Problem verhindern?

+0

Könnten Sie vielleicht Ihre Fehler genauer ausführen ... "mehrere Definitionen von ..." könnte eine Reihe von Dingen bedeuten? Sie können dies tun, indem Sie Ihre Frage bearbeiten. – silvergasp

Antwort

0

Im Allgemeinen ist der einfachste Weg zur Arbeit mit Nur-Header-Bibliotheken, den Code nur über Header zu erweitern. Vorausgesetzt, Sie verwenden die richtigen Header-Wächter, würde dies das Problem mehrerer Definitionen Ihres Codes beseitigen. Wenn Sie eine große Basis von vorhandenem Code haben, würde ich vorschlagen, dass Sie alle Ihre *.cpp Dateien in *.hpp (C++ Header-Dateien) umbenennen und dann passende Header-Wachen hinzufügen. Darüber hinaus besteht eine bequeme Möglichkeit, diesen Basiscode zu verarbeiten, darin, eine zusätzliche Headerdatei config.hpp zu erstellen und alle anderen Header in diese Datei einzufügen. Dann in Ihrem main.c ist es eine einfache Frage der Aufnahme der config.hpp Datei.

z.B.

// Config.hpp ------------------------------------------------= 
#include "example.hpp" 
#include "example1.hpp" 
#include "example2.hpp" 
// etc. 

// main.cpp --------------------------------------------------= 
#include "Config.hpp" 

int main() { 
    // Your code here. 
    return 0; 
} 

Außerdem, wenn Sie mit Ihrer Projektstruktur fortsetzen wollten, es wäre eine einfache Sache der Trennung der gesamten Code in Funktionen, die arpackcpp direkten Zugriff benötigt. Dann schließe sie alle in eine *.cpp Datei ein und kompiliere sie in eine *.o und verlinke.

+0

Danke für die Antwort. Das Ändern meiner Dateien in hpp hat geholfen. Die einzige \t Unannehmlichkeit, die ich gegenüberstelle, ist, dass meine Make-Datei keine Chancen innerhalb meiner * .hpp-Dateien erkennt. – dimmigen

+0

Ihr zweiter Vorschlag hat bei mir nicht funktioniert. Beim Einbinden der config.hpp bekam ich die gleichen Fehlermeldungen wie zuvor. Könntest du mir erklären, was der Unterschied ist, wenn du nur die config.hpp einfügst? – dimmigen

+0

@dimmigen Angenommen, Sie haben eine Reihe von Funktionen, die nur die arpack-Bibliothek verwenden. Wenn Sie all diese in eine 'some.c' Datei einfügen, #include" arpack "' nur in der 'some.c' Datei und nicht in der entsprechenden' some.h' Datei. Dies bedeutet im Wesentlichen, dass Sie nur die Header-basierten Funktionen einmal verwenden. – silvergasp

0

Als erstes helfen Wächter nicht an dieser Stelle, da sie nur mehrfache Einschlüsse eines Headers in einem "Teilbaum" des Abhängigkeitsgraphen Ihrer Projektdateien verhindern. Mit anderen Worten: Wenn Sie eine Kopfzeile in zwei vollständig getrennte Dateien desselben Projekts einfügen, ersetzt der C++ - Präprozessor die #include <header.h> zweimal und unabhängig durch den in der Kopfzeile angegebenen Code. Das ist völlig in Ordnung, solange der Header nur Deklarationen enthält.

In Ihrem Fall (und im Fall vieler anderer Nur-Header-Bibliotheken) werden Definitionen auch in den Headern bereitgestellt. Leider gibt es (so weit ich weiß) keinen anderen Weg, als einmal definitionsenthaltende Dateien in Ihr Projekt aufzunehmen. https://github.com/m-reuter/arpackpp/blob/master/include/README gibt explizit an, welche Dateien Definitionen enthalten.

Einige Bibliotheken bieten jedoch Präprozessor-Makros, um die Aufnahme von Definitionen für die bereitgestellten Header-Dateien auszulösen (z. B. https://github.com/nothings/stb). Vielleicht bietet arpackpp ähnliche Mechanismen.

+0

Danke für die Antwort. Mit arkcpp meinst du arpackpp? Oder ist das der Name einer anderen cpp-Bibliothek? Eine schnelle Google-Recherche ergab nichts, was mit dem Thema zu tun hatte. – dimmigen

+0

Sorry, nur ein Tippfehler. Natürlich meine ich arpackpp :). Ich korrigiere den Tippfehler in meiner Antwort. –

Verwandte Themen