Исключение С++ и предупреждение о символе 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 = С++ 11 -O3 -m64

После компиляции я получаю это предупреждение ld:

ld: предупреждение: прямой доступ в _main к глобальному слабому символу __ZN7MyerrorD1Ev означает, что слабый символ нельзя переопределить во время выполнения. Вероятно, это было вызвано тем, что разные единицы перевода компилировались с разными настройками видимости.

Я не получаю это предупреждение, если использую g++ вместо icpc.

Я не смог понять, что это значит и что вызывает это предупреждение. Код работает, как и ожидалось, однако я хотел бы не обращать внимания на то, что происходит.


person deepak    schedule 14.03.2013    source источник
comment
Вы #include <string>?   -  person jtepe    schedule 14.03.2013
comment
Вы пытались скомпилировать его с помощью -fvisibility=hidden?   -  person user2155932    schedule 14.03.2013
comment
@jotep Включение строки ничего не изменило.   -  person deepak    schedule 14.03.2013
comment
@ user2155932 Спасибо, помогло! Что сделала команда? И почему видимость символов была проблемой только в примере выше, но не в любом другом коде, который я скомпилировал?   -  person deepak    schedule 14.03.2013
comment
@deepak Что ж, похоже, все именно так, как написано: разные единицы перевода компилировались с разными настройками видимости. Скорее всего, некоторые из ваших библиотек (возможно, libstdc++) были скомпилированы с -fvisibility=hidden. g++ по умолчанию компилируется со скрытой видимостью.   -  person user2155932    schedule 15.03.2013
comment
@user2155932 user2155932 Интересно, похоже, мне нужно больше понять концепцию видимости символов. Спасибо!   -  person deepak    schedule 15.03.2013


Ответы (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?

person Milan Rusek    schedule 18.03.2013