Используйте статическую библиотеку 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
его заголовки и ссылки на него.