2013-03-14 6 views
6

Ich spiele mit Ausnahmen in C Erstellung ++ und ich habe den folgenden Testcode:C++ Ausnahme und ld Symbol Warnung

#include <iostream> 
#include <stdexcept> 
#include <new> 
using namespace std; 

class Myerror : public runtime_error { 
    private: 
     string errmsg; 
    public: 
     Myerror(const string &message): runtime_error(message) { } 
}; 

int main(int argc, char *argv[]) { 
    throw Myerror("wassup?"); 
} 

Ich Kompilieren dies mit:

icpc -std = c + +11 O3 -m64

Nach Kompilierung ich diese ld Warnung bin immer:

ld: warning: direkter Zugriff in _main auf globales schwaches Symbol __ZN7MyerrorD1Ev bedeutet, dass das schwache Symbol zur Laufzeit nicht überschrieben werden kann. Dies wurde wahrscheinlich dadurch verursacht, dass verschiedene Übersetzungseinheiten mit unterschiedlichen Sichtbarkeitseinstellungen kompiliert wurden.

Ich bekomme diese Warnung nicht, wenn ich g ++ anstelle von Icpc verwende.

Ich konnte nicht verstehen, was das bedeutet und was diese Warnung verursacht. Der Code läuft wie erwartet, aber ich möchte nicht verstehen, was passiert.

+1

Haben Sie '#include ' '? –

+2

Haben Sie versucht, mit '-visibility = hidden' zu kompilieren? – user2155932

+0

@jotep Das Einfügen von String hat nichts geändert. – deepak

Antwort

1

Versuchen Sie Folgendes:

#include <iostream> 
#include <stdexcept> 
#include <new> 
using namespace std; 

class Myerror : public runtime_error { 
    public: 
     Myerror(const string &message) throw(): runtime_error(message) { } 
     virtual ~Myerror() throw() {} 
}; 

int main(int argc, char *argv[]) { 
    throw Myerror("wassup?"); 
} 

Warum brauchen Sie nicht verwendete Zeichenfolge errmsg?

Verwandte Themen