C ++ objcopy, чтобы сделать метод класса слабым - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть этот заголовочный файл:

weather.h

#ifndef _WEATHER_H_
#define _WEATHER_H_

#include <string>
using namespace std;

class Weather {
    private:
        int temp;

    public:
        Weather();
        string announce();
};

#endif

Когда я компилирую связанный исходный файл, я хочу сделать объявление и слабым Weather (конструктор по умолчанию) во время компиляциивремя.

Для этого поток выглядит примерно так:

g++ -std=c++11 -g -Wall -c weather.cpp
objcopy --weaken-symbol=announce --weaken-symbol=Weather weather.o weather.o

Однако, когда я тогда скомпилирую другую версию погоды без ослабления?Я все еще получаю ошибку повторяющегося символа.

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

1 Ответ

0 голосов
/ 26 ноября 2018

Ослабление символов в одном файле и связывание всех объектов работает для меня.Убедитесь, что вы перекомпоновали все объекты (включая все конструкторы).

weather1.cpp

Weather::Weather() {}
string Weather::announce()
{
    return string("Bad weather");
}

weather2.cpp

Weather::Weather() {}
string Weather::announce()
{
    return string("Bad weather 2");
}

build.sh

g++ weather1.cpp -c -o weather1.o
g++ weather2.cpp -c -o weather2.o
g++ test.cpp -c -o test.o

objcopy --weaken-symbol=_ZN7Weather8announceEv --weaken-symbol=_ZN7WeatherC2Ev --weaken-symbol=_ZN7WeatherC1Ev weather2.o weather2.o

g++ *.o -o test.out

В зависимости от того, ослабляю ли я weather1.o или weather2.o, я вижу разные результаты из моей основной тестовой функции:

int main()
{
    Weather w;
    std::cout << w.announce() << "\n";

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...