Я пытаюсь использовать код на C в Unity3D pro.
Мой основной подход заключается в том, чтобы (1) встроить исходный код C в статическую библиотеку (2) создать пустой пакет и связать его с библиотекой (3) импортировать пакет в Unity 3D pro (какплагин).
Я в основном следовал этому учебнику .
Он работал у меня некоторое время до недавнего времени, когда я обновлял свой код C, перекомпилировал и перестраивалбиблиотека и пакет, все идет не так ...
Когда я впервые импортировал пакет, я получил DllNotFoundException .
На этом этапе мой проект пакета был простокуча библиотек - библиотека, построенная из моего исходного кода (который является файлом .a) и несколько других библиотек, от которых, я думаю, зависит библиотека .a (другие библиотеки имеют расширение .dylib).
Я добавил один файл test.c в комплект.Тестовый файл .c содержит только две строки:
#include <stdio.h>
#include "ccn.h"
char* say()
{
return "hi";
}
, в котором ccn.h является файлом заголовка из моего исходного кода на языке C.
После того, как я перестроил пакет, DllNotFoundExeption пропало, но я получил EntryPointNotFoundException .
Вот что я думаю:
- Поскольку Xcode настолько интеллектуален, яЯ предполагаю, что, в то время как добавлял простой файл test.c, XCode изменил некоторые из моих настроек пакета для меня.И я полагаю, что это причина, почему DllNotFoundException ушла в первую очередь. Я правильно думаю?
- Я думаю, что для решения проблемы EntryPointNotFound мне также придется изменить некоторые настройки проекта пакета, но я не знаю, как ... Пожалуйста, помогите мне ...
Огромное спасибо!
Редактировать
- Я видел этот поток , предполагая, что, поскольку Xcode использует g ++ длядля компиляции мне понадобится extern "C", даже если мой неуправляемый код написан на чистом C. Я изменил настройку цели в Xcode4 для " Компилятор для C / C ++ / Objective-C " с Apple LLVM3.0 до LLVM GCC 4.2 , но я все еще получаю то же исключение.
- Я также видел эту моно документацию , в которой говорится, что mono использует GLib для загрузки библиотек, а в Glib есть ошибка в Mac OS X, которая заключается в том, чтораспознавать библиотеки .dylib.Я удалил библиотеки .dylib и попробовал еще раз, но получал то же исключение.
- Также В документации Apple говорится, что каждый загружаемый пакет должен иметь основной класс,и если пользователь не указывает, какой класс является основным, NSBundle будет использовать первый класс, показанный в проекте Xcode, в качестве основного класса.Ну, я предполагаю, что созданный мной пакет является загружаемым, но поскольку он представляет собой просто статическую библиотеку, созданную из C, он буквально не имеет никакого класса.Когда я посмотрел на info.plist моего проекта , запись Principal Class просто пуста.Может ли это быть проблемой?Если да, то как мне это решить?
Также в документации Apple я увидел кое-что, чего я не совсем понимаю:
Если ваш загружаемый комплект представляет собой плагинв, разработчик хост-приложения обычно предоставляет интерфейс для архитектуры подключаемого модуля в платформе.Эта структура обычно содержит класс, от которого наследуются все основные классы подключаемого модуля, или протокол (формальный или неформальный) для принятия основным классом подключаемого модуля.
Я почти уверен, что загружаемый комплектЯ создаю это плагин.Я импортирую пакет в Unity3D.Означает ли это, что я должен определить основной класс из Unity?Как?