Как использовать С-шные библиотеки

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

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

Сообщение kitenok » 06.07.2005 11:17:59

Народ кто знает как подключать в lazarus библиотеки из каталога Libc у которых расширение .inc например stdlibh.inc
kitenok
новенький
 
Сообщения: 13
Зарегистрирован: 07.06.2005 11:11:11

Сообщение SovNarKom » 06.07.2005 12:59:15

{$I file.inc}
только это не библиотеки
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение Guest » 06.07.2005 14:43:26

возможно но они соответствуют h-файлам в иксах только добавлена в конце буква "h"
Guest
 

Сообщение ushakov » 06.07.2005 15:00:52

Есть такой unit, libc называется. Так вот там весь Libc и описывается. Поэтому просто добавте Libc в uses.
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение Guest » 06.07.2005 17:08:56

Что самое обидное не все там описано
Guest
 

Сообщение ushakov » 08.07.2005 13:34:35

Чего именно там Вы не нашли? У меня еще такого случая не было.
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение PVOzerski » 13.07.2005 11:37:51

Давайте немного разберемся...
И с терминологией, и с сутью.

О языках программирования. В данном случае нас интересуют два - Си и Паскаль. СтОит вспомнить еще Си++ как самый распространенный у разработчиков, но применительно к "скрещиванию" с FPC он пока не обычно очень актуален из-за несовместимости классов. Поэтому не буду его трогать.

О файлах, используемых в сборке приложений:
1) тексты программ - для Си они обычно имеют расширения .c, для FPC - .pp или .pas.
2) заголовочные файлы (хедеры) для Си - .h. У современного Паскаля несколько иная концепция, хедеров в строгом смысле у него нет, по смыслу к ним приближаются интерфейсные разделы модулей (расширения всё теже .pas и .pp). Однако в Паскале иногда используются и include-файлы (обычно с расширением .inc). В случае FPC они могут содержать почти любые куски текста на Паскале. В другие части проекта они включаются директивой {$i ...} или {$include ...}
3) Obj-файлы - двоичные результаты компиляции, предназначенные для сборки линкером и не делимые далее штатными средствами. В юниксах обычно имеют расширение .o.
4) Статические библиотеки - архивы obj-файлов, из которых линкер может вытаскивать нужные obj-модули в процессе сборки приложения и вставлять их код в собираемое приложение. В юниксах обычно имеют расширение .a.
5) Динамические (разделяемые) библиотеки - наборы функций в двоичном виде, код которых может вызываться приложениями без включения в единый с ним файл. В юниксах обычно имеют расширение .so.
6) Интерфейсные двоичные вспомогательные модули FPC, используемые компилятором для эффективного получения информации о содержимом obj-файла или статической библиотеки. В FPC версий старше 1.0.10 имеют расширение .ppu, в более старых версиях - в зависимости от платформы разные. При компиляции модуля (unit) компилятор FPC создает 2-3 файла - .ppu, .o и (опционально) .a.

Если мы имеем дело с obj-файлом, созданным компилятором Си, к нему изначально не прилагается .ppu - файла, поэтому указать его в uses-разделе невозможно. Содержащиеся в нем функции объявляются как external. А параметры и соглашения об их передачи контролируются самим программистом.
Например,

procedure proc1(p1: integer; p2: pchar); cdecl; external;

Этот подход поддерживается и компиляторами от Borland, но у FPC синтаксис несколько усовершенствован. Так, можно разрешить проблему недопустимых с точки зрения Паскаля имен, добавив директиву name:

procedure proc2(p1: integer; p2: pchar); stdcall; external name 'proc2@8';

А чтобы не линковать потом всё вручную, в FPC (как и в компиляторах от Borland) есть директива {$L ...}

Естественно, не возбраняется объединить эти функции в отдельный юнит. Что отчасти и сделано разработчиками.

Со статическими библитеками у FPC дело обстоит похоже , только нужно использовать директиву {$Linklib ..., static}. Единственная тонкость, притом, похоже, это по-разному у разных версий - проблема расширений и префиксов. Так, в юниксах обычно отбрасывают начальное "lib", а расширение .a тоже может подразумеваться. Например, для прилинковки библиотеки libfoo.a директива комплятора будет такая: {$linklib foo, static}

При использовании динамических библиотек в случае юниксов и win подходит почти такой же синтаксис, только без слова static. Кроме того, водможен и "дельфийский" стиль. При этом, в отличие от Delphi, FPC сам может подставить правильное расширение динамической библиотеке, что удобно для переноса с платформы на платформу.

В документации к FPC описано также подключение external-переменных из obj-файлов или статических библиотек - принцип тот же.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Guest » 24.07.2005 00:26:58

PVOzerski , dostatochno polnayainformaciya, no est' vopros po vsemu prochitannomu.
eto kasaetsya win32 i bibliotec ot MS(*.lib), oni takje mogut bit' ispol'zovani pri kompilyacii???
Guest
 

Сообщение LuckyDevil » 24.07.2005 20:58:41

Kakaya dosada, na poslednii vopros nikto ne otvetil (((.
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение SovNarKom » 24.07.2005 23:46:35

LuckyDevil
Ну сам можешь попробовать.
Со статическими библитеками у FPC дело обстоит похоже , только нужно использовать директиву {$Linklib ..., static}. Единственная тонкость, притом, похоже, это по-разному у разных версий - проблема расширений и префиксов. Так, в юниксах обычно отбрасывают начальное "lib", а расширение .a тоже может подразумеваться. Например, для прилинковки библиотеки libfoo.a директива комплятора будет такая: {$linklib foo, static}

Вот и попробуй linklib, а процедуры как обычно
procedure proc2(p1: integer; p2: pchar); stdcall; external name 'proc2@8';
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение LuckyDevil » 25.07.2005 01:03:34

SovNarKom
procedure proc2(p1: integer; p2: pchar); stdcall; external name 'proc2@8';

Ya ne viju odnoi melochi, gde yavnoe ukazanie, iz kakoi imenno lib budet importirovana procedura.

Poprobovat' seichas ne mogu, tol'ko cherez nedelyu poluchit'sya.
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение SovNarKom » 25.07.2005 10:50:45

Ооооох....
procedure proc2(p1: integer; p2: pchar); stdcall; external name 'proc2@8';


Вот так
procedure proc2(p1: integer; p2: pchar); stdcall; external 'libname' name 'proc2@8';
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение LuckyDevil » 25.07.2005 20:13:00

SovNarKom ,thx ))) imenno eto ya i hotel uvidet'.
Eshe vopros, v doke napisano chto mojno takje importirovat' peremenii, k primeru mne nado importirovat' peremennyu iz MS(.lib), kak v etom sluchae eto sdelat' pravel'no?
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

Сообщение SovNarKom » 25.07.2005 21:27:01

Ну, мне например, никогда не надо было импортировать переменные...
попробуй
c: integer; external 'libname' name 'varc';
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение LuckyDevil » 25.07.2005 21:53:19

SovNarKom , eshe ras spasibo, esli eto vse srabotaet, eto budet prosto chudesno.
LuckyDevil
новенький
 
Сообщения: 12
Зарегистрирован: 24.07.2005 12:33:16

След.

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

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

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

Рейтинг@Mail.ru