c++ - cppunit 和 xcode 项目的 vtable 问题

标签 c++ iphone xcode vtable cppunit

我正在尝试构建 zxing iphone 项目并运行在 cppunit-1.12.1 中编写的测试套件。我在项目中复制了 cppunit-1.12.1 代码,并将事件 SDK 更改为 10.5,我能够构建 cppunit 和 zxingcore 目标,但是当我尝试构建 zxingcore-tests 目标时,出现以下错误,这似乎与 vtable 有关,并且有一个与库的体系结构类型有关的奇怪警告:

有没有一种好的方法来格式化它,基本上是转义格式,而不必在每行前面插入 > 。我用过<pre>在预览中效果很好,但在最终渲染中效果不佳的标签——不尊重格式并切断文本。一旦有人给我建议,我就会修改格式。


Ld build/Debug/zxingcore-tests normal i386
cd /Users/andres/src/zxing/iphone
setenv MACOSX_DEPLOYMENT_TARGET 10.5
/Developer/usr/bin/g++-4.2 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Users/andres/src/zxing/iphone/build/Debug -F/Users/andres/src/zxing/iphone/build/Debug -filelist /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/zxingcore-tests.LinkFileList -mmacosx-version-min=10.5 -lzxingcore -lCppUnit -o /Users/andres/src/zxing/iphone/build/Debug/zxingcore-tests

ld: warning: in /Developer/SDKs/MacOSX10.5.sdk/usr/local/lib/libCppUnit.dylib, file is not of required architecture
ld: warning: common::Counted::Counted()has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/BitSourceTest.o
ld: warning: common::Counted::retain()    has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/BitSourceTest.o
ld: warning: common::ArrayRef::~ArrayRef()has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: std::valarray::operator[](unsigned long)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: common::ArrayRef::reset(common::Array*)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: common::ArrayRef::ArrayRef(common::Array*)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: common::ArrayRef::ArrayRef(common::ArrayRef const&)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o

....many more of these warnings...

现在出现错误


Undefined symbols:
  "vtable for CppUnit::TestSuiteBuilderContextBase", referenced from:
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BitArrayTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BitMatrixTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BitSourceTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BlackPointEstimatorTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in PerspectiveTransformTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in ReedSolomonTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in DataMaskTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in ErrorCorrectionLevelTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in FormatInformationTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in ModeTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in VersionTest.o
  "CppUnit::TestLeaf::doGetChildTestAt(int) const", referenced from:
      vtable for CppUnit::TestCaller in BitArrayTest.o
      vtable for CppUnit::TestCaller in BitMatrixTest.o
      vtable for CppUnit::TestCaller in BitSourceTest.o
      vtable for CppUnit::TestCaller in BlackPointEstimatorTest.o
      vtable for CppUnit::TestCaller in PerspectiveTransformTest.o
      vtable for CppUnit::TestCaller  in ReedSolomonTest.o
      vtable for CppUnit::TestCallerin DataMaskTest.o
      vtable for CppUnit::TestCallerin ErrorCorrectionLevelTest.o
      vtable for CppUnit::TestCallerin FormatInformationTest.o
      vtable for CppUnit::TestCallerin ModeTest.o
      vtable for CppUnit::TestCallerin VersionTest.o
  "typeinfo for CppUnit::TestCase", referenced from:
      typeinfo for CppUnit::TestCallerin BitArrayTest.o
      typeinfo for CppUnit::TestCallerin BitMatrixTest.o
      typeinfo for CppUnit::TestCallerin BitSourceTest.o
      typeinfo for CppUnit::TestCallerin BlackPointEstimatorTest.o
      typeinfo for CppUnit::TestCallerin PerspectiveTransformTest.o
      typeinfo for CppUnit::TestCallerin ReedSolomonTest.o
      typeinfo for CppUnit::TestCallerin DataMaskTest.o
      typeinfo for CppUnit::TestCallerin ErrorCorrectionLevelTest.o
      typeinfo for CppUnit::TestCallerin FormatInformationTest.o
      typeinfo for CppUnit::TestCallerin ModeTest.o
      typeinfo for CppUnit::TestCallerin VersionTest.o
  "CppUnit::TestLeaf::countTestCases() const", referenced from:
      vtable for CppUnit::TestCaller in BitArrayTest.o
      vtable for CppUnit::TestCaller in BitMatrixTest.o
      vtable for CppUnit::TestCaller in BitSourceTest.o
      vtable for CppUnit::TestCaller in BlackPointEstimatorTest.o
      vtable for CppUnit::TestCaller in 
`... lots of these errors ... `
CppUnit::assertEquals(qrcode::decoder::FormatInformation const&, qrcode::decoder::FormatInformation const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in FormatInformationTest.o
      void CppUnit::assertEquals(int const&, int const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in ModeTest.o
      void CppUnit::assertEquals(qrcode::decoder::Mode* const&, qrcode::decoder::Mode* const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in ModeTest.o
      void CppUnit::assertEquals(int const&, int const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in VersionTest.o
      void CppUnit::assertEquals(bool const&, bool const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in VersionTest.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
 

最佳答案

好吧,这就是我认为的问题所在,但不要引用我的话;)

cppunit 代码使用 CPPUNIT_API 宏来包装

__declspec(dllexport)

__declspec(dllimport)

在 Win32 上构建时。它不使用等效的

__attribute__ ((visibility("default")))

对于gcc。当将该代码包含在使用 gcc 中的可见性属性的项目中时,尤其是当项目使用 gcc 时,这可能会导致问题命令行标志

-fvisibility=hidden

默认情况下将所有符号设为库私有(private),然后使用

__attribute__((visibility("default")))

在适当的情况下代替__declspec(dllexport/import)。如果一个符号(例如 vtable)仅在一个库中被标记为隐藏,即使它在所有其他库中被标记为公共(public),那么显然(请参阅下面的链接)它被标记为隐藏,并且您会收到链接器错误。

在您的情况下,您最初收到的链接器警告表明 zxingcore-tests 正在使用默认隐藏的符号构建(在构建时检查该 -f 选项) )而 xzingcore 本身将它们公开。 cppunit vtable 的符号将存在于 cppunitzxingcorezxingcore-tests 中,但在 zxingcore-test 中标记为隐藏code> 因此它们被隐藏。

我认为您需要尝试找出为什么 zxingcore-tests 构建隐藏符号并阻止它这样做。

如需进一步阅读,请尝试 gcc wiki visibility page ,特别是关于“C++ 异常的问题”的部分(并点击其中关于模糊链接的链接,该链接表明它也适用于 vtable)。我对这些东西有点熟悉,因为我曾被库中的 dynamic_cast 失败所困扰,在这种情况下,这些失败是由错误隐藏 typeinfo 对象引起的。

关于c++ - cppunit 和 xcode 项目的 vtable 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1429475/

相关文章:

xcode - 如何在 swift 中使用performSelector 的默认协议(protocol)实现?

swift - 使用 po 时 Xcode 代码控制台打印空白

c++ - 没有匹配函数来调用带有引用参数的构造函数

c++ - Windows:最大化周围/像任务栏一样对待我的窗口?

iphone - Sharekit - 发送 url 链接到 Facebook

iphone - 我应该使用核心动画制作三点加载动画,还是应该找到一种方法来显示相同​​操作的 gif?

c++ - 为什么这些 CRTP 模式中只有一个可以编译?

c++ - C++ 根据鼠标位置查找菜单项

iphone - Tableviecells 没有被释放......内存管理问题

xcode - AVFoundation 框架中不存在 AVAudioSession