Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;objcopy使类方法变弱_C++_G++_Clang - Fatal编程技术网

C++ C++;objcopy使类方法变弱

C++ C++;objcopy使类方法变弱,c++,g++,clang,C++,G++,Clang,我有这个头文件: 天气 然而,当我编译另一个版本的天气没有减弱?我仍然得到一个重复的符号错误 我知道——削弱是存在的,但这只是一个示例,我不想覆盖削弱类中的每个方法。削弱一个文件中的符号并将所有对象链接在一起对我很有效。确保正在重新链接所有对象(包括所有构造函数) weather1.cpp Weather::Weather() {} string Weather::announce() { return string("Bad weather"); } Weather::Weather

我有这个头文件:

天气 然而,当我编译另一个版本的天气没有减弱?我仍然得到一个重复的符号错误


我知道——削弱是存在的,但这只是一个示例,我不想覆盖削弱类中的每个方法。

削弱一个文件中的符号并将所有对象链接在一起对我很有效。确保正在重新链接所有对象(包括所有构造函数)

weather1.cpp

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

Weather::Weather() {}
string Weather::announce()
{
    return string("Bad weather");
}
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;
}
intmain()
{
天气w;

STD::你能把两个天气文件的相关的<代码> Read Eng/E>代码行确认一个是弱的而另一个不是吗?使用<代码>弱化符号宣告< /代码>没有等号是否有区别?你的C++编译器,就像其他所有C++编译器一样,都使用名称的修饰。我可以100%肯定地向您保证,这不是“天气”和“公告”。@Paul Objdump没有显示任何弱符号,我看到的行为与我在头文件中手动插入弱属性时不同(我不想这样做)SamVarshavchik,即使我指定了损坏的符号名称,它也不会work@jajabarr对我来说似乎很好。我会在回答中添加我的解决方案。这并没有解决问题,但名称以下划线开头,后跟大写字母(
\u WEATHER\u H
)包含两个连续下划线的名称保留供实现使用。不要在代码中使用它们。类似地,它也可以仅弱化某些符号并重新定义另一个文件中的符号。有趣的是,如果两个函数都标记为弱,则最终链接命令中的第一个函数将被使用。这是w我最终发现了什么-谢谢!有趣的是,我已经编写了这方面的代码,但它在mac上不起作用。我发现了一个错误线程,说objcopy在macOS和x86体系结构方面有一些问题-我最终不得不在linux虚拟机上运行它以查看任何进展。