forked from KolibriOS/kolibrios
db785142be
git-svn-id: svn://kolibrios.org@9782 a494cfbc-eb01-0410-851d-a64ba20cac60
109 lines
4.7 KiB
Plaintext
109 lines
4.7 KiB
Plaintext
|
||
Быстрый старт
|
||
|
||
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. По умолчанию этот макрос будет
|
||
определен всегда, даже если Вы по каким то причинам не желаете
|
||
использовать новые преимущества. При использовании текущих
|
||
особенностей разделять код описанным в примере выше способом в
|
||
большинстве случаев не требуется. |