приложение - создание статической библиотеки c++




Использование статических библиотек C/C++ из приложений iPhone ObjectiveC (3)

Возможно ли иметь C статический библиотечный API API, который использует C ++ внутри и скрывает это от пользователей библиотеки?

Я писала портативную библиотеку C ++, которую я хочу статически связать с приложением iPhone.

Я создал проект Xcode с использованием шаблона «статической библиотеки» Max OS X и скопировал исходный код, а также написал C wapper (для обработки исключений), используя (extern «C»).

Я пытаюсь использовать сгенерированную библиотеку (файл .a) в другом приложении iPhone Cocoa.

Все работает хорошо, если я использую (.mm) расширения для вызывающего файла ObjectiveC и (.cpp) для класса реализации в библиотеке.

Но я получаю неразрешенные символы при связывании, когда я пытаюсь изменить файл-оболочку на расширение (.c), хотя все файлы функций-оболочек являются только функциями C.

Просто потому, что C ++ используется внутренне в библиотеке, означает ли это, что внешне это все равно должно рассматриваться как программа на C ++. Разве не в силах обеспечить эту абстракцию?

Редактировать: Спасибо за ответы,

Я использовал extern «C», я просто не знал, какие конфигурации там нужны в вызывающем проекте. то есть. если запроектированный вызов потребует знать, использовал ли он C ++ или может быть невежественным и считать его чистой C-библиотекой.

Казалось бы, я не могу, и я должен использовать (.mm) файлы на моих классах ObjectiveC.


В основном, когда вы компилируете C-функции с помощью компилятора C ++, он управляет именами функций и использует C ++ ABI.

Когда вы используете расширение * .cpp или * .mm, вы используете компилятор C ++.

То, что вы хотите сделать, - заставить компилятор генерировать функции C с именами un-mangles и с использованием C ABI.

Вы можете сделать это:

  • Компиляция с компилятором C.
  • Компиляция с компилятором C ++, но убедитесь, что вы префикс объявления функций с помощью extern "C"

Излюбленный способ настроить файл заголовка, чтобы один и тот же файл мог быть включен из исходных файлов C и C ++:

#ifndef HEADER_GUARD_1_H
#define HEADER_GUARD_1_H

#ifdef __cplusplus
extern "C" {
#endif

// Declare C function interface here.
int myFunc(int x,char*);

#ifdef __cplusplus
}
#endif

#endif 

Вы должны объявить функции, которые вы хотите видеть extern "C" . Их подписи должны быть C-совместимыми, но содержимое не имеет (например, вы можете обращаться к объектам C ++, но вы не можете передавать их напрямую, указатели в порядке). Затем символы будут видны любой C-совместимой среде.

EDIT: и скомпилируйте его как исходный файл C ++, C не имеет понятия языковой привязки. Есть пара других gotchas с языковой связью (например, тот факт, что все extern "C" функции extern "C" с тем же именем являются одной и той же функцией, независимо от пространства имен).

EDIT2: В заголовке вы можете проверить макрос __cplusplus и использовать его для установки на C ++ и другие языки соответственно (потому что C ++ потребует объявления extern "C" , и на других языках, вероятно, будут жаловаться на них).


спасибо, за такое хорошее обсуждение.

что я сделал:

1) Я создал статический lib, используя параметр cocaotouch static lib. В том, что у меня есть c / c ++ / obj-c all mix. однако мой экспорт - это только классы obj-c. Infact i использовал objc- to c в C ++.

2), тогда я создал приложение iphone в X-коде proj. Я добавил флагов другой ссылки my lib name (-lxyz) // мое имя lib - это libxyz.a Я добавил путь поиска lib, путь поиска заголовка

3), затем я собрал. У меня появились ошибки. говоря oeprator новый, оператор delete не найден.

3), то кроме моего appdelegate, контроллера просмотра, я добавил фиктивный cpp (.h, .cpp) ... atestdummy.h atestdummy.cpp

4) Затем я снова строю ...

Это сработало.

Итак - я, независимо от того, какие предложения они дали раньше, работал для меня. основная причина, если ур-приложение не видит файл .cpp file .mm с кодом cpp, связанный не будет использовать g ++.

Спасибо всем. Я прочитал выше и решил проблему.

Вы, ребята, хорошо делитесь.





c