2013-03-14 91 views
6

我在玩與創建使用C異常++,我有以下的測試代碼:C++異常和ld符號警告

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

我與編譯如下:

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

在編譯時我得到這個LD警告:

ld:警告:在_main中直接訪問全局弱符號 __ZN7MyerrorD1Ev表示弱符號不能在運行時被覆蓋。這可能是由不同的可見性設置編譯的不同翻譯單元 造成的。

如果我用g ++代替icpc,我不會得到這個警告。

我還沒有能夠理解這是什麼意思,什麼是導致此警告產生。代碼按預期運行,但是我想不想發生什麼事情。

+1

你有沒有'#include '? – 2013-03-14 06:12:19

+2

你試過用'-fvisibility = hidden'進行編譯嗎? – user2155932 2013-03-14 06:27:05

+0

@jotep包括字符串沒有改變任何東西。 – deepak 2013-03-14 17:24:58

回答

1

嘗試以下操作:

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

爲什麼你需要未使用的字符串ERRMSG?