2011-01-09 4 views
2

Warum läuft das Programm unten auf Mac OSX und Linux ausgeführt, aber nicht auf freebsd?C++ Ausnahme von Konstruktor Core-Dumps auf freebsd, aber nicht auf Linux oder Mac x

Die freebsd Core-Dumps, nachdem die Ausnahme mit der folgenden Meldung ausgelöst wird:

terminate called after throwing an instance of 'ObjectException' 
    what(): error not allowed 
[1] 28946 abort (core dumped) ./bin/main 

auf allen drei Plattformen I Gnu Compiler verwenden

freebsd g ++ --version: g ++ (GCC) 4.2.1 20070719

mac os x g ++ --version: i686-apple-darwin10-g ++ - 4.2.1

linux g ++ --version: g ++ (Gentoo 4.3.3 P1.0, torten 10.1.5)

freebsd uname -a: 8.1-RELEASE FreeBSD 8.1-RELEASE

ich Cmake verwenden das Makefile zu erstellen, so dass diese auch ähnlich auf jeder Plattform

Hier ist der Eintrag:

Kopf

#ifndef GUARD_Object_h 
#define GUARD_Object_h 

#include "boost/scoped_ptr.hpp" 
#include "string" 
#include "exception" 

using std::string; 

class Object 
{ 
private: 
    boost::scoped_ptr<string> _name; 
public: 
    Object(const string&); 
    string getName(); 
}; 

class ObjectException:public std::exception 
{ 
    virtual const char* what() const throw() 
    { 
     return "error not allowed"; 
    } 
}; 

#endif 

Haupt

#include "Object.h" 

Object::Object(const string &name):_name (new string) 
{ 
    *_name = name; 
    if(*_name == "error") 
    { 
     throw ObjectException(); 
    } 
} 

string Object::getName() 
{ 
    return *_name; 
} 

Haupt

#include <iostream> 
#include "Object.h" 

int main() 
{ 
    try 
    { 
     new Object("error"); 
    } catch(ObjectException&) { 
     std::cout << "error found" << std::endl; 
    } 
} 
+0

Könnten Sie bitte boost :: scoped_ptr in boost :: shared_ptr ändern und es erneut testen? –

+0

shared_ptr gibt das gleiche Ergebnis, – Cyberroadie

+0

auch wenn ich keine Smart Pointer verwende, bekommt es Core Dump – Cyberroadie

Antwort

2

Funktioniert für mich auf FreeBSD 8.1-RELEASE-p2 und OSX 10.6.6.

Sie könnten eine falsche Version von libstdC++ in Ihrem Suchpfad haben. Wenn ich einen Link auf FreeBSD 8.1, ich die folgende Ausgabe von ldd erhalten:

[email protected]: test3 $ ldd a.out 
a.out: 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x800649000) 
    libm.so.5 => /lib/libm.so.5 (0x800854000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800973000) 
    libc.so.7 => /lib/libc.so.7 (0x800a80000) 

Wenn Ihr deutlich anders aussieht möglicherweise eine Laufzeitbibliothek Mismatch haben. Wenn Sie ein Problem haben, können Sie versuchen, mit "g ++ -static" zu verknüpfen, um die Laufzeitbibliothek zum Zeitpunkt der Verbindung statisch zu verknüpfen. Wenn das funktioniert, müssen Sie Ihren Computer reparieren.

Update:

Es sieht aus wie Compiler und Laufzeitbibliothek nicht übereinstimmen, und dass wahrscheinlich durch Cmake Konfigurationsproblem verursacht wird. Sie haben vermutlich eine Version von gcc in/usr/local installiert, die wahrscheinlich einen Port verwendet.

Wenn Sie mit System gcc kompilieren, müssen Sie eine Verbindung mit den Laufzeitbibliotheken in/usr/lib herstellen. Wenn Sie mit einem gcc in/usr/local kompilieren, müssen Sie eine Verknüpfung mit den Bibliotheken in/usr/local herstellen. Wenn Sie beabsichtigen, die Binärdateien zu versenden, sollten Sie wahrscheinlich system gcc oder statisch verknüpfen.

Eine andere Möglichkeit ist, den gcc-Port zu deinstallieren und es erneut zu versuchen, vorausgesetzt, Sie kümmern sich nicht wirklich um den gcc-Port.

+0

es funktioniert mit -static, also ich denke, ich muss neu installieren, oder ist cmake die falschen libs verlinken? :-( – Cyberroadie

+0

Sie erhalten gcc-Bibliotheken von/usr/local/lib, also haben Sie wahrscheinlich einen gcc-Port installiert, oder Sie haben gcc von Hand installiert. Wenn Sie mit System gcc kompilieren, müssen Sie mit den Laufzeitbibliotheken in verbinden/usr/lib. Wenn Sie mit einem gcc in/usr/local kompilieren, müssen Sie mit den Bibliotheken in/usr/local verlinken.Wenn Sie beabsichtigen, die Binärdateien zu versenden, sollten Sie wahrscheinlich system gcc oder statisch verknüpfen Ja, Sie haben wahrscheinlich ein Cmake-Konfigurationsproblem. – janm

+0

Eine andere Möglichkeit ist (wenn Sie sich nicht um den Port gcc kümmern), ist einfach den gcc-Port zu deinstallieren und die Umgebung erneut herauszufinden und zu versuchen. – janm

2

ich kompiliert und lief Code auf FreeBSD 8.1 ohne Probleme (mit g++ -I/usr/local/include -g Main.cpp Object.cpp). Vielleicht müssen Sie den Boost auf diesem Computer aktualisieren (neu installieren)?

+0

Ich bestätige dies. Funktioniert einwandfrei unter FreeBSD 8.1 und OSX 10.6.6. Was sagt der Stack-Trace im Core Dump? – janm

+0

ah, muss es etwas mit cmake sein, wenn ich es mit dem Befehl testen Sie gab es tatsächlich funktionieren, wenn ich mit dem Cmake generierte Makefile es Core-Dumps kompiliert – Cyberroadie

Verwandte Themen