Вызов функции C с использованием экземпляра класса Objective C

У меня есть класс Objective C с методом типа C. Мне нужно связать библиотеку C++ и библиотеку C с моим кодом. Если я делаю вызовы библиотеки из любой функции Objective C, я получаю ошибки компоновщика, что он не может найти символы.

см. использование статической библиотеки c++ в задаче c

Но мне нужно как-то вызвать эту функцию C. Есть ли альтернатива? В случае только библиотек C я мог бы вызывать библиотеки из объективного метода C, но библиотека C++ не позволяет мне это делать. Я не знаю почему.


person neeraj    schedule 10.10.2012    source источник
comment
Итак, функцию, которую вы пытаетесь вызвать, C или C++?   -  person    schedule 10.10.2012
comment
Судя по другому вопросу, вы пытаетесь вызвать экспортированный интерфейс extern "C" функций C++ из программы Objective C. Это создаст головную боль для системы.   -  person Jonathan Leffler    schedule 10.10.2012
comment
@JonathanLeffler Почему? Если функция объявлена ​​как extern "C", то проблем с искажением имени не возникает... А поскольку Objective-C является строгим надмножеством C, вызов функции C из Objective-C не должен быть проблемой...   -  person    schedule 10.10.2012
comment
Я пытаюсь вызвать функцию в библиотеке С++, которая, в свою очередь, внутренне пытается вызвать другую функцию в библиотеке С. Для вызова функции библиотеки С++ я должен написать все такие вызовы функций в функции C-стиля в Objective-C. Я попытался предварить объявление метода С++ (в файлах заголовков) с помощью extern C, компилятор показывает ошибку.   -  person neeraj    schedule 10.10.2012


Ответы (2)


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

Добавьте сюда Objective C, и вы можете столкнуться с некоторыми трудностями — ваш вопрос подразумевает, что вы сталкиваетесь с некоторыми трудностями. Я не пробовал это, но...

Вы должны быть уверены, что связаны правильные библиотеки C++, правильные библиотеки Objective C, а также любые случайные библиотеки C, которые вам нужны. Если вы можете определить библиотеки, которые компонуются при сборке программы на Objective C, вы можете быть достаточно безопасным, просто компонуя компилятор C++ и перечисляя библиотеки Objective C и чистого C, которые вам нужны. Скрестим пальцы, вот и все. Если существуют сложные требования к установке для Objective C (а также сложные требования для C++), то у вас все равно могут возникнуть трудности. Хотя в целом у вас, скорее всего, все в порядке.

Если кто-то с определенным опытом говорит что-то другое, используйте его решение (если оно работает для вас). Но лучшее, что я могу предложить, это «связать программу с компилятором C++».

person Jonathan Leffler    schedule 10.10.2012
comment
Я слышал о чем-то, называемом Objective-C++, основное назначение которого — разрешить вызов кода C++ из Objective-C. Будет ли это полезно здесь? - person Mike DeSimone; 10.10.2012
comment
@MikeDeSimone Нет. Вы пропустили этап сборки. Objective-C++ — это концепция компиляции кода. OP испытывает трудности с связыванием его. - person ; 10.10.2012
comment
Видите ли, в заголовочных файлах С++ было несколько «пространств имен», поэтому мне пришлось преобразовать типы файлов Objective-C из исходных файлов Objective-C в исходные файлы Objective-C++. Когда я это делаю, в каком-то источнике говорится, что компоновка выполняется через компилятор C++. В настройках сборки также есть опция, с помощью которой я могу связать цели в соответствии с типами файлов. Если я не изменю типы файлов, мне придется добавить флаг компоновщика -lstd++ для компиляции с C++ - person neeraj; 10.10.2012

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

person simonc    schedule 10.10.2012
comment
У меня нет исходного кода файла С++. У меня есть только объявления API в файлах заголовков. я пытался пометить объявление функций с помощью extern C, но компилятор писал об этом. Что я делаю, так это включаю библиотеку С++, объявляю ее экземпляры и вызываю ее методы в функции в объектном C. Если этот метод объективного C не соответствует стилю C, я получаю ошибки компоновщика. - person neeraj; 10.10.2012