2013-03-14 8 views
6

gram z tworzenia wyjątków w C++ i mam następujący kod testowy:C++ wyjątek i ld symbol ostrzegawczy

#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?"); 
} 

Mam kompilacji to z:

ICPC -std = c + +11 -O3 -m64

Po kompilacji otrzymuję to ostrzeżenie ld:

ld: ostrzeżenie: bezpośredni dostęp w _main do globalnego słabego symbolu __ZN7MyerrorD1Ev oznacza, że ​​słaby symbol nie może zostać nadpisany w czasie wykonywania. Prawdopodobnie spowodowało to, że różne jednostki tłumaczeniowe były skompilowane z różnymi ustawieniami widoczności.

Nie otrzymam tego ostrzeżenia, jeśli używam g ++ zamiast icpc.

Nie byłem w stanie zrozumieć, co to oznacza i co powoduje generowanie tego ostrzeżenia. Kod działa zgodnie z oczekiwaniami, jednak chciałbym nie podrobić tego, co się dzieje.

+1

Czy "#include "? –

+2

Czy próbowałeś skompilować z '-fvisibility = hidden'? – user2155932

+0

@jotep W tym ciąg nic nie zmienił. – deepak

Odpowiedz

1

Spróbuj wykonać następujące czynności:

#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?"); 
} 

Dlaczego musisz niewykorzystaną ciąg Errmsg?

Powiązane problemy