Быстрый старт tcc используется как обычно (см. справку tcc). Расширение KX использользует файлы определений символов (*.def) для динамических библиотек (файлы *.o, не требуются, исключение - статические *.o, если они нужны для работы программы). Примеры по сборке см. в директории /samples Примечание: ключ -nobss был удален, так как он не имеет смысла (ранее генерировавшаяся bss секция заполнялась нулями и занимала ненужное место в файле, эта секция не должна содержаться в образе и ядро инициализирует эту часть нялями автоматически при загрузке) В директории /lib поставляются файлы *.def (определение символов динамических библиотек), crt0.o (поддержка кода С) и *libtcc.a (вспомогательная библиотека tcc), а также некоторые статические библиотеки *.a. Кроме того, имеется библиотека tiny.o для возможности линковки приложений без поддержки кода С, в том числе объектных файлов созданные сторонними компиляторами. Во избежание конфликтов бибилиотек с использованием возможностей предоставляемых расширением KX рекомендуется использовать только одну директорию с библиотеками [++, в которой не должно быть взаимоисключающих библиотек]. Если определено несколько директорий библиотек, в каждой из них не должно быть конфликтных библиотек. Например, при таком подключении библиотеки -llibc tcc ищет файлы в следующем порядке: libc.def, liblibc.def, liblibc.a Обратите внимание, что все три варианта будут правильными и будет использован первая найденная бибилиотека. Также обратите внимание, что для корректной работы приложения с расширением KX все динамические библиотеки должны быть обработаны только с *.def Файлы определения символов Расширение KX использует файлы определений символов (*.def). Файлы *.def используют простой формат и могут создваться и редактироваться в любом удобном текстовом редакторе. Структура файла *.def описана ниже. ; Комментарии начинаются точкой с запятой и игнорируются при обработке ; ; Первая строка должна начинаться с ключевого слова LIBRARY с указанием ; имени библиотки c расширением (не более 3 симоволов после точки) LIBRARY libname.obj ; На следующей строке следует ключевое слово EXPORTS и ; опциональный ключ prefix EXPORTS [prefix] ; если задан ключ prefix, то во всех символах должен использоваться ; префикс из имени библиотеки (без расширения) со следующим за ним символом ; подчеркивания. Префикс будет отброшен при постоении таблицы импорта ; Например, для библиотеки http.obj префикс должен быть http_ ; из символа http_get в таблицу импорта будет записан символ get [libname_]entry1 [libname_]entry2 ; все остальные символы библиотеки Заголовочные файлы динамических библиотек Для импотируемых функций поддерживается два способа их объявления: - с префиксом атрибута импорта (рекомендуется для новых бибилиотек). Данный способ дополнительно уменьшает размер приложения. __attribute__((dllimport)) void foo(int); - внешняя функция с вызовом по указателю (устаревший способ, используется для совместимости с имеющимися на данный момент заголовками) extern int (*foo)(const char*); ВНИМАНИЕ: объявление импортируемой функции с вызовом по указателю без спецификатора extern является ошибкой, которую tcc не может отследить, так как данная конструкция является правильной с точки зрения языка С int (*foo)(const char*); => ошибка!!! Объявление импортируемых функций без __attribute__((dllimport)) не поддерживается и будет генерировать ошибку линкера void foo(int); => ошибка!!!, останов линкера. Проверка поддержки расширения KX Для проверки, что tcc поддерживает расширение KX: 1. в командной строке наберите tcc -v Строка ниже означает, что имеется поддерка расширения KX tcc version 0.9.26 (i386 KolibriOS/KX extension 0.4.6) 2. В коде для условной компиляции используйте директивы препроцессора проверки предопределенного макроса __KX__, например #ifdef __KX__ // код который должен компилироваться только с расширением KX #else // код, который не зависит от расширения KX #endif Обратите внимание, что в настоящее всемя этот макрос показывает, что компилятор поддерживает расширение KX. По умолчанию этот макрос будет определен всегда, даже если Вы по каким то причинам не желаете использовать новые преимущества. При использовании текущих особенностей разделять код описанным в примере выше способом в большинстве случаев не требуется.