Обтекание библиотеки C ++ в Objective-C не скрывает символы C ++ - PullRequest
5 голосов
/ 15 марта 2011

Я пытаюсь обернуть библиотеку C ++ (для Sybase Ultralite) с Objective-C, чтобы библиотеку можно было импортировать в MonoTouch. Я создал библиотеку Objective-C и включил скомпилированную библиотеку C ++ в этот проект, libulrt.a . Чтобы компилировать мой проект, я установил путь к Путь поиска заголовка пользователя , чтобы он указывал на каталог, в котором находятся заголовочные файлы C ++. Затем мне пришлось установить источник компиляции как в Objective-C ++ .

Проблема теперь в том, что, хотя библиотека-оболочка компилируется правильно, как только я включаю ее в другой проект Xcode, мне нужно снова установить источник компиляции как в Objective- C ++ в противном случае проект, потребляющий мою библиотеку-оболочку, выдает ошибки компоновки. Я не понимаю, почему это так, потому что заголовочный файл для моей библиотеки-оболочки содержит только код Objective-C, а не код C ++ вообще. Код C ++ находится только в реализации (файл * .mm) библиотеки-оболочки. Что мне нужно сделать, чтобы сделать реализацию C ++ полностью прозрачной для проекта, использующего библиотеку оболочки? Другими словами, я хочу иметь возможность включать свою библиотеку-обертку и компилировать с исходным кодом компиляции, когда установлен в Objective-C . У кого-нибудь есть идеи, как это сделать?

Ошибки компоновки, которые я получаю при компиляции проекта, использующего мою обертку, следующие: (Я сократил список ошибок, потому что он ДЛИННЫЙ!)

"operator delete(void*)", referenced from:
zc3db40339fee::~zc3db40339fee()in libUltralite.a(ee39bf4763.o)
zb4297ee7d543::~zb4297ee7d543()in libUltralite.a(747e80fdad.o)
z33836a0a6f46::~z33836a0a6f46()in libUltralite.a(f240efda30.o)
"___cxa_pure_virtual", referenced from:
vtable for ze78b0ec59364in libUltralite.a(2c50e8e8ff.o)
vtable for ze78b0ec59364in libUltralite.a(2c50e8e8ff.o)
vtable for ze78b0ec59364in libUltralite.a(2c50e8e8ff.o)

Файл заголовка для моей библиотеки-оболочки выглядит следующим образом:

#import <Foundation/Foundation.h>

@interface DataAccess : NSObject {}

// Release objects.
- (void)dealloc;

// Singleton instance of the DataAccess class. 
+ (DataAccess*)sharedInstance; 

// Finalize the Database Manager when done with the DB.
+ (void)fini;

// Adds the given name to the database. 
- (void)addName:(NSString *)name;
@end 

Кто-нибудь знает, как я могу скомпилировать его как Objective-C ++, но проекты, использующие эту библиотеку, все еще видят его как Objective-C?

Ответы [ 3 ]

6 голосов
/ 16 марта 2011

@ Марк Бесси здесь на правильном пути, но он ошибается, потому что между настройкой языка и добавлением библиотеки C ++ есть небольшая разница.Добавление библиотеки C ++ является дешевым и обязательным (так или иначе).Изменение языка стоит дорого, потому что компилятор ObjC ++ работает медленнее, а полученный код, по моему опыту, немного труден для работы с GDB через XCode.

Все, что вам нужно, это добавить -lstdc ++ к вашемуLD_FLAGS (другие флаги компоновщика) в вашем потребляющем проекте.Убедитесь, что для параметра «Тип стандартной библиотеки C ++» установлено значение «Динамический».

1 голос
/ 16 марта 2011

Вам придется создавать свою оболочку как общий объект, а не статическую библиотеку. Статическая библиотека не связана, разрешение функций (и в частности функций стандартной библиотеки C ++, используемых в коде, который вы упаковываете) происходит во время ссылки.

1 голос
/ 15 марта 2011

Похоже, вам нужно статически связать библиотеку времени выполнения C ++ с вашей библиотекой-оберткой, чтобы действительно обойти это. Я думаю, что тогда вы можете столкнуться с проблемами, если клиент библиотеки будет использовать Objective-C ++, и в результате вы получите две версии стандартной библиотеки C ++ в одной программе.


Быстрый тест с проектом MacOS, похоже, показывает, что вам нужно установить тип библиотеки C ++ на «статический» и, возможно, также установить «символы, скрытые по умолчанию».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...