IOS — Создание оболочки оболочки для проекта C ++ в XCode

Итак, у меня есть проект C ++, который я хочу поместить в каркас, который будет действовать как обертка (написанная на Objective-C / C ++) для кода C ++, так что позже я смогу использовать его в проекте Swift или Objective-C просто добавив фреймворк в приложение.

Что я достиг на данный момент:

  • Созданы все обертки
  • Выставил публичные заголовки оболочки на этапе сборки
  • На этапе сборки добавлен run-скрипт, который просто копирует все заголовки 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);

1

Решение

При написании оболочки 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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]