所以,我有一个C++项目,我想将它放入一个框架中,该框架将充当包装器(用Objective-C/C++编写)到C++代码中,以便我可以稍后在Swift或Objective-C项目中通过简单地将该框架添加到应用程序中来使用它。在Xcode中构建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,这是我将所有标题复制到脚本的位置。但是,构建会失败并产生大量随机错误,而不会识别已定义的类型。
关于如何让这个工作的任何想法?
感谢
UPDATE(日志):
<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);
您是在为macOS或iOS开发应用程序吗? CPU架构不一样。你有没有尝试创建一个图书馆项目?或者你是否将C++和Objective-C++代码放在同一个应用程序项目中?是Objective-C++的文件扩展名** .mm **而不是**。m **? – JazzSoft
当你有生成问题总是复制粘贴错误信息。有两个原因:它更容易理解你的问题(我们不依赖你的解释),如果有人有类似的问题,它更容易谷歌它。 –
for iOS,这是一个可可触摸框架项目,添加到一个ios应用程序项目中,C++和obj-C++代码一起在框架项目中,扩展名为.mm for obj-C++ – luis