我从共享库中抛出一个exeception并将其捕获到另一个库中。我控制所有源代码,所以它应该没问题我使用g ++ 4.4.5。首先,以下代码不起作用:
try
{
// do something that throws tags::out_of_range in the other shared lib
}
catch(const tags::out_of_range& e)
{
cout << "out_of_range " << typeid(tags::out_of_range()).name() << endl;
cout << "out of range exception " << typeid(e).name() << endl;
}
catch (const exception& e2)
{
cout << "out_of_range " << typeid(tags::out_of_range()).name() << endl;
cout << "other exception " << typeid(e2).name() << endl;
}
我总是最终只捕获一个std :: exception。打印代码中显示的typeid()。name()给出了可能的解释:
out_of_range FN4tags12out_of_rangeEvE
其他例外N4tags12out_of_rangeE
我们可以看到名称不匹配,如果我理解正确,当类在不同的模块中时,名称实际上是字符串比较动态转换。
所以我在某处读取尝试添加-fPIC,突然它起作用(意味着我捕获了out_of_range异常),虽然打印名称仍然给出相同的结果。我认为位置无关的代码不再重要,并且在g ++手册页中查看-fPIC:
“此选项对m68k,PowerPC和SPARC有所不同”
我使用的是x86-64。我真的不明白代码定位如何在这种情况下有所作为?另外,如果typeid名称是字符串比较我认为我仍然会在std :: exception子句中结束,因为即使使用-fPIC它们仍然不同?
所以问题:为什么-fPIC会有所不同?