Директивы компилятора

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Директивы компилятора

Сообщение Yurik » 22.12.2009 21:43:51

Добрый день, уважаемые форумчане!

Помогите, пожалуйста, разобраться с директивами компилятора. Для меня FreePascal новая и еще не изученная штука.

Я сделал полную трансляцию SQLite3 API для делфи и несложный объектный враппер для нее -- теперь хочу это дело адаптировать для FreePascal. В принципе, всё уже хорошо компилируется и работает, но у меня нет возможности протестировать работоспособность библиотеки в Linux и MacOS X.

В связи с этим вопросы:
1) что такое {$LINKLIB *}? Нужно ли это использовать? Я импортирую функции из библиотеки классическим делфийским способом:

Код: Выделить всё
function sqlite3_open(const filename: PAnsiChar; var ppDb: PSQLite3): Integer; cdecl; external sqlite3_lib;


константу sqlite3_lib я задаю так:

Код: Выделить всё
const
{$IFDEF MSWINDOWS}
  sqlite3_lib = 'sqlite3.dll';
{$ENDIF}
{$IFDEF UNIX}
  sqlite3_lib = 'sqlite3.so';
{$ENDIF}
{$IFDEF DARWIN}
  sqlite3_lib = 'libsqlite3.dylib';
{$ENDIF}


Будет ли это работать, к примеру, на MacOS X? Я просто встречал какие-то хитрости с {$LINKLIB *}, поэтому берут сомнения...
Подскажите, пожалуйста.

2) По поводу {H+}. Эта директива по умолчанию добавляется в новые модули при работе в Lazarus. Нужно ли мне использовать ее, если я работаю с WideString-ами? В делфи вроде как {H+} включена по умолчанию.

3) Нужно ли устанавливать совместимость с сишными рекордами при помощи директив {$PACKENUM 4} и {$PACKRECORDS C}, если в функциях используются указатели на рекорды, сами рекорды не передаются? Нужно ли использовать packed record-ы вместо обычных?

Я буду также рад, если кто-нибудь поможет протестировать библиотеку под Linux и MacOS X. Ну или вообще протестировать библиотеку, если интересно. Приаттачу по первому запросу.
Yurik
незнакомец
 
Сообщения: 5
Зарегистрирован: 22.12.2009 21:15:19

Re: Директивы компилятора

Сообщение Mr.Smart » 22.12.2009 22:13:51

1 - нет не нужно;
2 - включайте её на всякий ...;
3 - если вы в своём коде не используете данные рекорды, то достаточно просто указатель (Pointer).
з.ы. Хотелось бы увидеть ваше творение и соответственно протестировать её на платформах Darwin и Unix :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Директивы компилятора

Сообщение Padre_Mortius » 22.12.2009 22:50:46

А чем существующий порт в FPC не устроил?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Директивы компилятора

Сообщение Yurik » 23.12.2009 06:34:14

Padre_Mortius, с портом в FPC все в порядке :) Но он не до конца полный. К примеру, нет (по крайней мере я не нашел) таких важных функций, как sqlite3_blob_open()... -- позволяют писать в BLOB в любую позицию и читать из BLOB-а с любой позиции (например, когда BLOB большой, чтобы в память его не грузить). Еще там имена переменных, которые опущены в заголовочном сишном файле, указаны как _para1, _para2 и т.д. Я их брал из непосредственного объявления функции. Это конечно не так важно, но все ж.

Идея такова, чтобы сделать полную трансляцию SQLite3 API и поддерживать ее. Просто для делфи полной трансляции не видно, по крайней мере бешплатной и с возможностью использования в коммерческих продуктах. Есть разнообразные неполные трансляции.

Написав ее для делфи, я подумал, а не сделать ли мне ее также и для FreePascal? И вот.

Mr.Smart, спасибо за ответ! Творение прилеплю следующим постом.
Yurik
незнакомец
 
Сообщения: 5
Зарегистрирован: 22.12.2009 21:15:19

Re: Директивы компилятора

Сообщение ifrost » 23.12.2009 09:08:06

Автор Synaps-а уже хорошо потрудился в этом направлении
http://www.ararat.cz/doku.php/en:sqlitewrap
ifrost
новенький
 
Сообщения: 21
Зарегистрирован: 13.11.2009 09:19:51

Re: Директивы компилятора

Сообщение Yurik » 23.12.2009 09:23:33

См. аттач.

Библиотеки DLL, SO и т.д. не прикладываю, их можно скачать здесь: http://www.sqlite.org/download.html

По поводу библиотек, кстати, вот может кто знает, где можно скачать библиотеку для MacOS X и почему ее нет на офиц. сайте SQLite? Здесь явно какая-то хитрость :)

ifrost: угу, именно у автора Synapse я и подсмотрел название библиотеки для MacOS X, он же меня и запутал с {$LINKLIB *}. :)

Mr.Smart: по поводу третьего вопроса. Я все рекорды объявил, поэтому их можно передать в соответствующие функции. Но они передаются именно как указатели на рекорды, а не как сами рекорды, поэтому и вопрос -- нужно ли устанавливать выравнивание и т.д. соответствующими директивами.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Yurik
незнакомец
 
Сообщения: 5
Зарегистрирован: 22.12.2009 21:15:19

Re: Директивы компилятора

Сообщение Mr.Smart » 23.12.2009 15:29:19

Yurik писал(а):По поводу библиотек, кстати, вот может кто знает, где можно скачать библиотеку для MacOS X и почему ее нет на офиц. сайте SQLite? Здесь явно какая-то хитрость :)

Ммм да интересно. Можно попробовать её самому скомпилировать или из портов поставить. Хотя Apple сама его использует и возможно она есть по умолчанию в системе. Надо посмотреть...

Поставьте на всякий случай директиву {$PACKRECORDS C} в начале модуля :wink:

Добавлено спустя 37 минут 48 секунд:
з.ы. Я предлагаю переименовать данную тему в что нибудь вроде "Полная трансляция SQLite3 API" и поместить эту тему в форум "Сторонние средства/Базы данных"...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Директивы компилятора

Сообщение Yurik » 23.12.2009 19:55:56

Mr.Smart писал(а):з.ы. Я предлагаю переименовать данную тему в что нибудь вроде "Полная трансляция SQLite3 API" и поместить эту тему в форум "Сторонние средства/Базы данных"...


Я совершенно не против. Кто это может сделать?

По поводу директивы {$PACKRECORDS C}, то хотелось бы конечно знать точно, нежели наверняка... Может подскажет кто?

Mr.Smart, как там насчет тестирования под линуксом и MacOS X? Там вложена демка, которую можно откомпилировать, только я файл Project1.lrs удалил из архива, а то получался слишком большой файл -- не прикреплялся к форуму. Надеюсь, что это некритично.
Yurik
незнакомец
 
Сообщения: 5
Зарегистрирован: 22.12.2009 21:15:19

Re: Директивы компилятора

Сообщение Mr.Smart » 24.12.2009 18:26:06

Протестирую как только время появится, а пока: корпоративы, гулянки, новый год и т.д.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Директивы компилятора

Сообщение VirtUX » 11.04.2011 08:28:57

Как можно проверить режим компиляции (GUI Console)? Т.е. проверить директиву $APPTYPE.
Чтоб было что-то типа:
Код: Выделить всё
Classes, SysUtils
  {$ifdef apptype gui}
  , StdCtrls, Spin, EditBtn
  {$ENDIF}
  ; 
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Директивы компилятора

Сообщение zub » 11.04.2011 10:21:35

Завести директиву компиляции которая будет управлять $APPTYPE, но тогда придется забыть о галачке в свойствах проекта и включать выключать гуй коментируя\раскоментируя эту директиву. Я так поступаю с heaptrc, т.к. не нашел способа определить подключен он или нет
Код: Выделить всё
{$DEFINE MYGUI}
....
{$IFDEF MYGUI}
            {$APPTYPE GUI}
{$ENDIF}
....
{$IFDEF MYGUI}
            чтото хитрое
{$ENDIF}


Ну и тоже вопрос по директивам: можно какнибудь инклудить файл только если он есть на диске, а если его нет - включить вместо него кусок кода? Было бы полезно для revision.inc, иначе приходится включать его в svn или обязательно запускать перед компиляцией svn2revisioninc
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru