我试图为你清楚地描述我的问题,所以它可能有点长,我真的很感激,如果你能阅读它并提供一些建议。谢谢。
我有一个库项目,我们称之为MyCppLib
,其中包含一些遗留的c ++代码,我在这个项目中添加了一个适配器类,以便我可以在其他项目中使用objective-c ++。以下是MyCppLib
项目的概述。
项目 MyCppLib
- 一些遗留的c ++代码
- Adapter.h
- Adapter.mm
我有另一个项目,我们称之为Main
项目,它使用MyCppLib
项目作为静态库。因此,我使用xCode 4编译MyCppLib
,并在xCode 4中获取libMyCppLib.a
和config Main
项目,以将其与Main
项目链接。以下是Main
项目的概述。
项目主要
- 一些Objective-c类 ,不包含'.mm'文件
- Adapter.h
- libMyCppLib.a 作为静态库
当我在xCode 4中编译Main
项目时,我遇到了一些错误:
架构armv6的未定义符号:
“operator new(unsigned long)”,引自:
- libMyCppLib.a中的[Adapter init](Adapter.o)
我 :: CPP :: 命名空间 :: MyCppClass :: MyCppClass ()在libMyCppLib.a( MyCppClass .o)... 其他一些类似的错误
ld:找不到架构armv6的符号
collect2:ld返回1退出状态
我认为可能因为Main
项目没有objective-c ++功能,所以我在Main
项目中添加了一个'.mm'文件。现在Main
项目应该是这样的:
项目主要
- 一些Objective-c类 ,不包含'.mm'文件
- Adapter.h
- libMyCppLib.a 作为静态库
- DummyObjCpp.h
- DummyObjCpp.mm
然后,我编译Main
项目,成功!
所以,最后,我的问题是:如何在不添加'.mm'文件的情况下将Main
项目配置为具有objective-c ++功能?
答案 0 :(得分:6)
好的,我已经读了几遍这个问题,但我仍然不确定我是否理解这个问题。
虽然我已经使用Objective-C,C ++和Objective-C ++做了很多,但我没有遇到过你用静态库描述的场景(因为我的大多数开发都是针对OS X而不是iOS,允许动态库和首选的地方。)
听起来你的第二个项目可能存在问题,因为.h文件本身并没有充分说明.a中包含的内容(即当你将它与你的可执行文件的其余部分组合时,你'我需要与libstdc++.dylib
联系起来。您可以尝试将Adapter.h
标题文件的“文件类型”从默认的C header
更改为C++ header
,如下图所示: