所以,我有一个 C++ 项目,我想将它放入一个框架中,该框架将充当 C++ 代码的包装器(用 Objective-C/C++ 编写),以便我以后可以在 Swift 或 Objective-C 项目中使用它通过简单地将框架添加到应用程序。
到目前为止我已经完成了:
#include "LocalHeader.h"
而不是它当前的编写方式#include "CppRootFolder/Subfolder/Header.h"
. 我也不想这样做,因为我想保持 C++ 文件不变。问题:
一切似乎都运行良好,除了在构建实际应用程序时,xcode 会出错,说它无法在文件结构中找到文件。为了说明我的意思,我有以下几点:
#include "CppRootFolder/umbrella.h"
(c++ 伞文件)#include "CppRootFolder/Subfolder/Header.h"
我对此的看法:
我似乎很清楚问题在于编译器需要从 C++ 代码的根文件夹中找到头文件。因此,在实际的应用程序中,在构建设置中,我将标题搜索路径添加到:$BUILT_PRODUCTS_DIR/FrameworkName.framework/Headers,这是我使用脚本复制所有标题的地方。但是,构建失败并产生大量随机错误,无法识别已定义的类型。
关于如何让它发挥作用的任何想法?
谢谢
更新(日志):
<module-includes>:1:9: note: in file included from <module-includes>:1:
#import "Headers/Box2D.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17:
#import "World.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10:
#import "Box2D/Box2D.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:34:10: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:34:
#include "Box2D/Common/b2Settings.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Settings.h:153:8: error: must use 'struct' tag to refer to type 'b2Version'
extern b2Version b2_version;
^
<module-includes>:1:9: note: in file included from <module-includes>:1:
#import "Headers/Box2D.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17:
#import "World.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10:
#import "Box2D/Box2D.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:35:10: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:35:
#include "Box2D/Common/b2Draw.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Draw.h:22:10: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Draw.h:22:
#include "Box2D/Common/b2Math.h"
^
/Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Math.h:28:31: error: unexpected type name 'int32': expected expression
int32 ix = *reinterpret_cast<int32*>(&x);
当您编写包装器时,C++ 不应在外部可见。因此#include "cppHedarFile.h"
不应在包装器外部访问,否则您将在 Objective C 代码中使用 C++ 时出错。
所以不应该有 C++ 头文件的伞头文件。
请提供技术细节:复制粘贴您看到的错误消息。您对错误的解释可能会产生误导。
/Box2D.framework/Headers/Box2D/Common/b2Math.h:28:31: error: unexpected type name 'int32': expected expression
int32 ix = *reinterpret_cast<int32*>(&x);
告诉我我是对的。很可能您包含了来自 Objective C 文件的 C++ 头文件*.m
。对于此类文件,无法访问 C++ 标准头文件,这int32
就是无法识别类型的原因。
就像我写的乞讨。当您围绕 C++ 编写 Objective C 包装器时,禁止从公共头文件中包含 C++ 头文件。您只能*.mm
从内部标头的表单文件中执行此操作,这些标头仅由*.mm
. 这样包装器就可以完成他们的工作并从包装器的用户那里处理 C++。
公共标题KXSomeClass.h
:
@interface KXSomeClass : NSObject
@property (nonatomic, readonly) BOOL allowed;
- (NSUInteger)someAction:(NSString *)s;
@end
私有标头 KXSomeClass+Internal.h
// this header is used only by wrappers
#import "KXSomeClass.h"
#include <memory>
@interface KXSomeClass ()
- (instancetype)initWithNativeSomeClass:(const std::shared_ptr<SomeClass>&)nativeObject;
@end
执行 KXSomeClass.mm
#import "KXSomeClass+Internal.h"
@interface KXSomeClass ()
@property (assign, nonatomic) std::shared_ptr<SomeClass> native;
@end
#import "KXSomeClass+Internal.h"
#include "cpp/SomeClass.h"
@implementation CSCapability
- (instancetype)initWithNativeSomeClass:(const std::shared_ptr<SomeClass>&)nativeObject
{
if (self = [super init]) {
_native = nativeObject;
}
return self;
}
- (NSUInteger)someAction:(NSString *)s
{
return _native->SomeAction(s.UTF8String);
}
- (BOOL)allowed
{
return _native->Allowed();
}
@end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句