C++ CPPFUnit和xcode项目的vtable问题

C++ CPPFUnit和xcode项目的vtable问题,c++,iphone,xcode,vtable,cppunit,C++,Iphone,Xcode,Vtable,Cppunit,我正在尝试构建zxing iphone项目,并运行用CPPFUnit-1.12.1编写的测试套件。我在项目中复制了CPPFUnit-1.12.1代码,并将活动SDK更改为10.5,我能够构建CPPFUnit和zxingcore目标,但是当我尝试构建zxingcore测试目标时,我得到了以下错误,这些错误似乎与vtables有关,并且一个奇怪的警告与库的架构类型有关: 是否有一种很好的格式化方法,基本上是转义格式化,而不必在每行前面插入>即可。我曾经 ……更多的警告。。。 现在是错误 __decl

我正在尝试构建zxing iphone项目,并运行用CPPFUnit-1.12.1编写的测试套件。我在项目中复制了CPPFUnit-1.12.1代码,并将活动SDK更改为10.5,我能够构建CPPFUnit和zxingcore目标,但是当我尝试构建zxingcore测试目标时,我得到了以下错误,这些错误似乎与vtables有关,并且一个奇怪的警告与库的架构类型有关:

是否有一种很好的格式化方法,基本上是转义格式化,而不必在每行前面插入>即可。我曾经 ……更多的警告。。。 现在是错误

__declspec(dllexport)

好吧,我认为问题出在这里,但不要引用我的话

cppunit代码使用一个cppunit_API宏来结束

__declspec(dllimport)

在Win32上构建时。它没有使用等价物

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

__attribute__((visibility("default")))
默认情况下,使所有符号成为库的专用符号,然后使用

在适当的情况下替代uu declspecdllexport/import。如果某个符号(如vtable)仅在一个库中被标记为隐藏,即使它在所有其他库中被标记为公共,那么显然可以看到它下面的链接被标记为隐藏,并且会出现链接器错误

在您的案例中,最初收到的链接器警告表明ZZingCore测试是使用默认隐藏的符号构建的,在构建时检查-f选项,而xzingcore本身将它们公开。cppunit vtables的符号将存在于cppunit、zxingcore和zxingcore测试中,但标记为隐藏在zxingcore测试中,因此它们被隐藏

我认为您需要尝试找出zxingcore测试构建隐藏符号的原因,并阻止它这样做


进一步阅读,特别是C++异常问题的章节,并在其中引用模糊链接的链接,这也显示它适用于VTABLE。我对这些东西有点熟悉,因为我已经被跨库的动态强制转换失败所困扰,在这种情况下,是因为typeinfo对象被错误地隐藏了。

我认为问题在于cppunit和zxingcore库是为armv6构建的,而zxingcore测试是为英特尔体系结构构建的。将zxingcore测试的配置设置更改为NATIVE_ARCH后,编译似乎很好。

我在使用库时也遇到过类似的问题。通过确保在两个project的构建设置中都设置了以下内容,我已经能够修复这些问题:

在目标信息-构建-GCC 4.2-代码生成下:

确保“隐藏的内联方法”和“默认情况下隐藏的符号”都已关闭


这可能有点像大锤技术,但它是有效的。如果有人能提出一种更细粒度的方法来解决这个问题,我很感激。

有没有办法通过简单地转义整件事的格式来格式化它?在/Developer/SDKs/MacOSX10.5.sdk/usr/local/lib/libCppUnit.dylib上运行文件的结果是什么?/Developer/SDKs/MacOSX10.5.sdk/usr/local/libCppUnit.dylib:Mach-O 64位动态链接共享库x86_64@Andres:谢谢。不确定,我想这可能是在转移注意力。请参阅我的答案,了解我认为可能的原因。事实上,考虑到您在vtables和typeinfo对象之外的其他对象上存在链接器错误,这样做更有意义。如果我坚持使用简单的文件方法就好了!英雄联盟
__attribute__ ((visibility("default")))
-fvisibility=hidden
__attribute__((visibility("default")))