Используйте статическую библиотеку C ++ в проекте Objective-C Xcode - PullRequest
2 голосов
/ 23 октября 2011

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

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

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

Ответы [ 3 ]

1 голос
/ 21 декабря 2016

Возможно, ваша проблема в том, что заголовок .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 при компиляции и компоновке?

0 голосов
/ 01 февраля 2013

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

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

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

0 голосов
/ 16 ноября 2011

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

...