kolibrios/programs/develop/ktcc/trunk/bin/doc/ru/How to use.txt
Coldy db785142be ktcc: added __attribute__((dllimport)) support
git-svn-id: svn://kolibrios.org@9782 a494cfbc-eb01-0410-851d-a64ba20cac60
2022-04-24 17:28:28 +00:00

109 lines
4.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Быстрый старт
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. По умолчанию этот макрос будет
определен всегда, даже если Вы по каким то причинам не желаете
использовать новые преимущества. При использовании текущих
особенностей разделять код описанным в примере выше способом в
большинстве случаев не требуется.