• Unity создает приложения на языках java и swift в зависимости от выбора платформы?

    @elmm
    Раньше Unity непосредственно компилировала C# в платформозависимый бинарный код для ios и android. Сейчас они это делают (могут делать) через C++. Это было сделанно, т.к. C++ компиляторы лучше оптимизируют и умеют генерить более производительны код. По умолчанию эта опция включена для iOS и выключенна для Android (по крайне мере так ещё было 2-3 релиза тому назад, т.к. у андроидной версии IL2CPP был эксперементальный статус).

    C++ код получается весьма специфический - там не сильно используются фишки C++, всё делаетс через статичекие методы, и сгенерённый код пестрит всякими служебными макросами, но в сопоставить куски кода сгенерённые на C++ с исходным C# скриптом вполне возможно, так что в случае бага, который проявляется только на iOS, но нет в редакторе, можно вполне результативно подебажится в XCode.

    C Android я не сильно в курсе - в теории он теперь должен кушать "нативные" проекты, но не пробовал.
    Ответ написан
    Комментировать
  • Как линкуются .cpp файлы к файлам .h?

    @elmm
    Несколько уточню ситуацию. Сначала идёт компиляция всех c/cpp (и не только - что укажешь компилятору) файлов. При компиляции по исходнику проходит препроцессор и на место #include подставляет содержимое подключаемых файлов. Таким образом и main.cpp и file.cpp будут содержать вначале file.h с описанием класса. На выходе для каждой единицы компиляции класса получается объектный файл с скомпилированным кодом, где вместо адресов функций указывается какую функцию надо поставить при линковке (модифицированное компилятором имя функции, отражающее перечень аргументов ф-ции, способ вызова и прочее см. name mangling).

    При линковке все указанные обьектные файлы, библиотеки (просто контейнер для обьектых файлов) собираются в один исполняемые файл - вот тут уже линкер и находит что из main.obj из некой функции вызывается фйнкция, из file.obj, и подставляет нужный вызов.

    По сути .h файлы это сахар, что-бы много раз не писать в каждом компилируемом модуле forward declaration чего либо, и компилятор вообще может ни чего не знать о существовании тех же .h файлов, если препроцессор реализован как отдельная программа (см. больше про C препроцессор).
    Ответ написан
    Комментировать