2016-09-19 3 views
0

Zuerst habe ich versucht, GMP zu verwenden, weil Boost-Dokumentation sagt, es ist schneller, aber die gmp.h-Datei fehlt Boost-Bibliothek, so musste ich installieren GMP-Bibliothek und kopieren Sie die gmp.h. Nachdem ich das getan habe, bekam ich externes Symbol Fehler, wenn ich mpz_int benutze. Also entschied ich mich, cpp_int auszuprobieren, kopierte das Beispiel aus der Boost-Dokumentation und es funktionierte. das ist, was ich versucht:Ich kann nicht herausfinden, warum multi-precision Berechnung nicht funktioniert mit Boost-Bibliothek

#include <boost/multiprecision/cpp_int.hpp> 
#include <iostream> 

int main() 
{ 
    using namespace boost::multiprecision; 

    int128_t v = 1; 

    // Do some fixed precision arithmetic: 
    for(unsigned i = 1; i <= 20; ++i) 
     v *= i; 

    std::cout << v << std::endl; // prints 20! 

    // Repeat at arbitrary precision: 
    cpp_int u = 1; 
    for(unsigned i = 1; i <= 100; ++i) 
     u *= i; 

    std::cout << u << std::endl; // prints 100! 

    return 0; 
} 

So dann habe ich eine Fakultäts-Funktion in einer Math-Klasse, aber jetzt jedes Mal, wenn ich eine Variable aus cpp_int Bibliothek verwenden erhalte ich diesen Fehler: Fehler LNK2019: nicht aufgelöstes externes Symbol __CrtDbgReportW verwiesen Funktion "Leere __cdecl std :: _ Debug_message (wchar_t const *, wchar_t const *, unsigned int)" (? _Debug_message @ std @@ YAXPB_W0I @ Z)

Nun jedes Mal, wenn ich versuchen, einen neuen Wert zuweisen Variable I cpp_int Bekomme diesen Fehler, das Seltsame ist, dass das Beispiel funktioniert hat und jetzt das selbe Beispiel nicht für dieses Projekt funktioniert, aber wenn ich ein neues Projekt erstelle und die selbe Boost-Lib verwende, funktioniert es wieder.

+1

* Nachdem ich dies getan habe, bekam ich externe Symbol Fehler bei der Verwendung von mpz_int. Also habe ich beschlossen, cpp_int auszuprobieren, habe das Beispiel aus der Boost-Dokumentation kopiert und es hat funktioniert. Das ist es, was ich ausprobiert habe: * - Sie sollten Bibliotheken nicht wirklich austauschen, solange Sie nicht genau wissen, was Sie tun. Versuch und Irrtum ist nicht der richtige Ort, wenn Sie versuchen, eine Anwendung zu erstellen. – PaulMcKenzie

+0

Ich habe versucht, herauszufinden, wie man große Zahlen berechnet. Es war nicht in einer Anwendung, an der ich arbeite, habe ich ein neues Projekt dafür erstellt, Versuch und Irrtum ist der Weg, neue Dinge zu lernen, nicht wahr? – user3196144

+1

Die Bibliotheken zu wechseln und glücklicherweise etwas zur Arbeit zu bringen lehrt Sie nicht, warum die anderen Bibliotheken oder Bibliotheken nicht funktionierten. Wenn Sie unter Windows irgendeine Art von Entwicklung durchführen und mit einem Bibliotheksproblem eines Drittanbieters konfrontiert werden, müssen Sie unbedingt wissen, was zu tun ist, wenn dies erneut geschieht. Die Antwort von shrike hat einige Einblicke gegeben, warum das Problem existiert. – PaulMcKenzie

Antwort

1

Es ist wahrscheinlich, dass eine der von Ihnen verwendeten Bibliotheken (wahrscheinlich die Bibliothek cpp_int) mit der Debug-Version der Visual Studio-Laufzeitbibliothek verknüpft werden soll. (Symbol __CrtDbgReportW in der Debug Version der VS-Laufzeitbibliothek definiert ist nur.)

Achten Sie darauf, Ihren Code für das entsprechende Ziel (Debug/Release) kompilieren, die Drittanbieter-Bibliotheken Sie verwenden für die kompilierte dasselbe Ziel, und Sie verknüpfen mit der entsprechenden Laufzeitbibliothek.

EDIT (nach den Kommentaren hinzugefügt Sie früher):

Achten Sie darauf, Ihren Code für die Version der VC-Laufzeitbibliothek StaticDebug kompilieren (aka libcpmtd.lib):

In Visual Studio , öffnen Sie den Dialog Projekteigenschaften und stellen Sie unter Configuration Properties ->C/C++ ->Code Generation das Feld Runtime Library auf: Multi-threaded Debug (/MTd).

Beachten Sie, dass jede andere Bibliothek, die Sie mit Ihrem Build verknüpfen, die gleiche Einstellung haben muss.

+0

Wie stelle ich sicher, dass die Bibliotheken von Drittanbietern für das Debug-Ziel kompiliert werden? Und ich benutze nur die Header-Dateien von Boost-Bibliothek, verwende ich verschiedene Header für verschiedene Laufzeiten? – user3196144

+0

Sie verwenden die gleichen Header für alle Bibliotheken.Header-Dateien haben normalerweise nichts damit zu tun, mit welcher Bibliothek Sie verlinken. Die einzige Ausnahme hiervon ist, wenn Ihre Header-Dateien '#pragma comment (lib," somelib ")" angegeben haben und den Linkern Anweisungen geben, welche Bibliothek verwendet werden soll. Ich glaube, das ist, wie Boost Dinge tut (wenn Sie beispielsweise keine Bibliothek angeben und Sie eine der Boost-Klassen verwenden, die keine Header-Only-Klassen sind, gibt der Linker an, welche Bibliothek Ihnen fehlt - - aber das ist nur über das spezielle '# pragma 'möglich, das ich erwähnt habe. – PaulMcKenzie

+0

Der Linker gibt mir nichts über fehlende Bibliotheken, deshalb verwende ich nur Header-Klassen, und ich bin sicher, dass ich meinen Code für das entsprechende Ziel kompiliere, sonst kann ich nicht kompilieren, wenn ich Header mit dem falschen Ziel einfüge Compiler kann die Header-Datei nicht finden. – user3196144

Verwandte Themen