Итак, у меня есть проект C ++, который я хочу поместить в каркас, который будет действовать как обертка (написанная на Objective-C / 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"
не должен быть доступен вне оболочки, иначе у вас будут ошибки при использовании C ++ в коде Objective C.
Так что не должно быть зонтичного заголовочного файла для заголовков C ++.
Пожалуйста, предоставьте техническую информацию: скопируйте сообщение об ошибке, которое вы видите. Ваша интерпретация ошибки может вводить в заблуждение.
Вы вставили не все, кроме этой строки:
/Box2D.framework/Headers/Box2D/Common/b2Math.h:28:31: error: unexpected type name 'int32': expected expression
int32 ix = *reinterpret_cast<int32*>(&x);
Дай мне понять, что я прав.
Скорее всего, вы включаете заголовки C ++ из файла Objective C *.m
,
Для такого файла C ++ стандартные заголовки недоступны, поэтому тип int32
не признается
Как я уже писал на попрошайничестве. Когда вы пишете оболочку Objective C для 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
Других решений пока нет …