繁体   English   中英

在Xcode中为C ++项目构建包装器框架

[英]Building a wrapper framework for C++ project in Xcode

因此,我有一个C ++项目,我想放入一个框架中,该框架将充当C ++代码的包装器(用Objective-C / C ++编写),以便以后可以在Swift或Objective-C项目中使用它只需将框架添加到应用中即可。

到目前为止,我已经完成了什么:

  • 创建了所有包装器
  • 在构建阶段公开包装器的公共标头
  • 在构建阶段添加了一个运行脚本,以将所有C ++标头(保留其文件目录结构)简单地复制到框架的目录中,以便使用该框架的应用程序可以使用它们。 我之所以这样做,而不仅仅是将它们放在构建阶段的标头字段中,是因为有很多文件和文件夹,并且这样做需要我将每个标头更改为#include "LocalHeader.h"比目前写成#include "CppRootFolder/Subfolder/Header.h" 我也不想这样做,因为我想保持C ++文件不变。

问题:

一切似乎都运行良好,除了在构建实际的应用程序时,xcode会错误地指出无法在文件结构中找到文件。 为了说明我的意思,我有以下几点:

  • 该框架的伞形文件将#include "CppRootFolder/umbrella.h" (C ++伞形文件)
  • 在CppRootFolder / umbrella.h中,我有几个#include "CppRootFolder/Subfolder/Header.h"
  • 每个子文件夹内的头文件中的每个头文件都包含其他头文件,这些头文件是从c ++代码的根文件夹中引用它们的。

我对此:

在我看来,问题很明显,就是编译器需要从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"应该不能在包装器外部访问,否则您将在目标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文件*.m C ++头文件。 对于此类文件,C ++标准标头不可访问,这就是为什么无法识别int32原因。

就像我在乞讨时写的那样。 在围绕C ++编写Objective C包装程序时,禁止包含公共标头中的C ++标头。 你可以这样做只能形成*.mm从中仅用于内部头文件*.mm 包装器通过这种方式完成工作,并从包装器用户处处理C ++。


公开标头KXSomeClass.h

#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

专用标头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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM