我有一个 C++ 库,我正在尝试使用 Clang 在 Mac OS X 上运行。该库由一个 DLL 和一个单元测试可执行文件组成。它使用 GCC 和 MSVC 编译良好,使用 GCC,我使用以下设置:
- 该库是用
-fvisibility=hidden
- 所有公开的类都明确标记为
__attribute__(visibility("default"))
- 该库有一些异常类,派生自
std::runtime_error
. 所有这些类都标记为默认可见性。有一个根类LibraryException
可以派生出更具体的异常。 - 在 GCC 上,我使用
-std=c++0x
clang,库和单元测试可执行文件都是用-stdlib=libc++ -std=c++11
在 Mac OS X 上,单元测试框架现在失败了,因为异常类型错误。即这样的测试失败:
// bla.foo () throws CustomException, which is derived from LibraryException
TEST_THROWS (bla.foo (), CustomException)
// This works however
TEST_THROWS (bla.foo (), LibraryException)
我验证了我的自定义异常类的 typeinfo 和 vtable 是使用nm -g library.dylib | c++filt -p -i
. 这似乎是所有例外的情况......这里到底发生了什么?我试图调试错误,我看到了如何在库中抛出正确的类型,但在单元测试可执行文件中无法捕获相同的类型。Clang 是否需要一些特殊的东西才能使其正常工作?我正在使用来自 SVN 的最新 googletest 框架进行测试。
一个小测试程序也出现了同样的问题:
try {
funcThatThrowsCustomExceptionFromLibraryDylib ();
} catch (CustomException& e) {
// doesn't get here
} catch (LibraryException& e) {
// does get here
// after demangle, this prints CustomException
// Can cast down to CustomException and access the fields as well
std::cout << typeid (e).name () << "\n";
}
例如,当boost::lexical_cast
从库中抛出异常时,它也会失败。