首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Xcode为C++项目构建包装框架

用Xcode为C++项目构建包装框架
EN

Stack Overflow用户
提问于 2017-08-10 19:59:28
回答 1查看 2.3K关注 0票数 1

因此,我有一个C++项目,我想把它放到一个框架中,作为C++代码的包装器(用Objective/C++编写),这样以后我就可以在Swift或Objective项目中使用它,只需将该框架添加到应用程序中即可。

到目前为止我所取得的成就:

  • 创建了所有包装器
  • 在构建阶段公开包装器的公共标题
  • 在构建阶段添加了一个运行脚本,只需将所有C++头(保持其文件目录结构)复制到框架的目录中,以便应用程序可以使用该框架。我之所以这样做,而不仅仅是把它们放在构建阶段的header字段中,是因为有很多文件和文件夹,而这样做将需要我将每个标头更改为#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,添加了一个头搜索路径,这是我用脚本复制所有标头的地方。但是,构建失败并产生许多随机错误,无法识别已经定义的类型。

我有什么办法让这件事起作用吗?

谢谢

更新(日志):

代码语言:javascript
复制
<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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-10 21:01:00

当您编写包装器时,C++不应该在外部可见。因此,不能在包装器之外访问#include "cppHedarFile.h",否则在目标C代码中使用C++会出现错误。

因此,不应该有C++头的伞式头文件。

请提供技术细节:复制粘贴错误信息,您正在看到。你对错误的解释可能有误导性。

除了这一行之外,你没有粘贴所有内容:

代码语言:javascript
复制
/Box2D.framework/Headers/Box2D/Common/b2Math.h:28:31: error: unexpected type name 'int32': expected expression
    int32 ix = *reinterpret_cast<int32*>(&x);

告诉我我是对的。很可能您正在包括目标C文件中的C++头,*.m。对于这样的文件,C++标准标头是不可到达的,这就是为什么不能识别int32类型的原因。

就像我在乞讨时写的一样。当您围绕C++编写目标C包装时,禁止从公共标头中包含C++头。您只能从仅由*.mm使用的内部标头中从表单*.mm文件中执行此操作。通过这种方式,包装器可以完成他们的工作,并从包装器的用户手中传递C++。

示例

公共头KXSomeClass.h

代码语言:javascript
复制
@interface KXSomeClass : NSObject

@property (nonatomic, readonly) BOOL allowed;

- (NSUInteger)someAction:(NSString *)s;

@end

私有报头KXSomeClass+Internal.h

代码语言:javascript
复制
// 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

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45622538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档