Используйте статическую библиотеку C++ в проекте Objective-C Xcode

Я создал в iOS статическую библиотеку для касания какао, в которой у меня есть классы C++ (файлы.h и.cpp).

Я успешно создал проект, но когда я включаю эту библиотеку (с расширением.a) и любой файл.h, я получаю ошибку компиляции.

Как я могу добавить эту библиотеку в свой проект target-C и использовать классы C++?

3 ответа

Решение

Скорее всего, вам просто следует переименовать ваши.m-файлы, которые являются объектно-ориентированными на файлы.mm, которые могут принимать код C++ (target-C++).

Во-вторых, нужно проверить, правильно ли все включено, перед заголовком библиотеки.

Также проверьте архитектуру, для которой вы создали свою библиотеку. Если вы запускаете на эмуляторе - это должен быть x86, если для развертывания на устройстве - arm.

Возможно, ваша проблема в том, что заголовок.h содержит код C++. Вы должны прочитать о "единицах компиляции". Короче говоря, невозможно сказать, на каком языке написан заголовочный файл для компилятора. Поэтому он всегда использует язык исходного файла, который включает в себя заголовок. Так что, если вы включите заголовок C++ из .m файл, он не будет работать.

Но есть решение: Apple изобрела "новый язык", который называется Objective-C++, который позволяет вам записывать операторы C++ и Objective-C в одном файле. Для каждого файла ObjC, который использует заголовок C++, вы должны изменить суффикс имени файла исходного файла, который его использует, с .m (ObjC) в .mm (ObjC++), что означает, что исходные файлы смогут компилировать заголовки ObjC и C++.

Конечно, вы можете не захотеть менять все ваши файлы на ObjC++. С одной стороны, C++ (и, соответственно, Objective-C++) - это язык с гораздо более сложным синтаксисом, чем C и Objective-C, поэтому время компиляции будет больше, а также C++ ведет себя по-разному в некоторых аспектах, чем C (и, соответственно, расширение). ObjC++ ведет себя немного иначе, чем ObjC).

Обычно люди ограничивают части C++ своими файлами реализации и держат C++ вне заголовка. Они пишут класс Objective-C, который "оборачивает" класс C++ и предоставляет методы, которые вызывают соответствующие методы C++ для объекта C++. Тогда любой файл ObjC в вашем проекте может включать этот класс без необходимости включать сам компилятор ObjC++, который внутренне ("тайно") использует ObjC++ для вызова кода C++.

Некоторые полезные советы о том, как скрыть код C++ внутри класса ObjC, см. В разделе Могу ли я отделить основную функцию и классы C++ от процедур Objective-C и / или C при компиляции и компоновке?

Если вы собрали.a в той же системе, проблем быть не должно #includeего заголовки и ссылки на него.

Другие вопросы по тегам