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虚拟机上运行它以查看任何进展。