Опять преобразование H файлов

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

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

Ответить
anzo
новенький
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Опять преобразование H файлов

Сообщение anzo »

Проблема при преобразовании сишных H фалов в pascal форму.
Один из H фалов содержит ссылку на файл time.h в котором хранится структура tm.
На какой файл мне ссылаться в fpc?
Нашел такой файл
fpc\2.2.4\source\packages\libc\src\timeh.inc

Пишу в начале
{$i timeh.inc}
все равное не собирается.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

anzo писал(а):Пишу в начале
{$i timeh.inc}
все равное не собирается.

в сконвертированный файл добавь в секцию uses модуль libc.

использовать модуль libc не очень хорошо, но вреда большого не должно принести.

разумеется {$i timeh.inc} нужно убрать

p.s. если возникнут ещё проблемы с конвертированием, пожалуйста, не создавай дополнительных тем, пиши в этой ;)
anzo
новенький
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Сообщение anzo »

Ок. С открытием новой темы поторопился... Надо было в старую писать.
Libc добавил в uses. Но компилятор ее не видит, нужно добавить в пути поиска
fpc\2.2.4\source\packages\libc\src\
fpc\2.2.4\source\rtl\unix\
fpc\2.2.4\source\rtl\linux\
....

?
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

правильно ли я понимаю, операционка - windows?
anzo
новенький
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Сообщение anzo »

Пока собираю на Windows, а работать должна на Linux.
А что есть разница в использовании библиотек В Lazarus'e под win32 и linux?
То есть проверить правильно ли я разрабатываю я приложение для линукса под виндой не получится?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

anzo
Если хотите проверять правильность работы то необходимо это делать на нативной системе.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

просто проблема в том, что

Код: Выделить всё

uses libc;

скорее всего не скомпилируется на Винде, потому что модуль libc не компилируется под винду.
Зато на Linux-е всё должно получиться!

как вариант предлагаю просто скопировать объявление типа tm в портируемый файл, что-то вроде

Код: Выделить всё


{$ifdef Unix}
uses libc;
{$endif}


{$ifdef MSWindows}
{libc types. todo: use libc}
type
  tm = packed record
     ...
  end;
{$endif}
anzo
новенький
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Сообщение anzo »

Хорошо, спасибо за совет попробую!
anzo
новенький
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Сообщение anzo »

Вернулся я снова к этой задаче. Все выше указанное сделал на Ubunte+Lazarus.
Столкнулся со следующей проблемой при линковании ругается.
MainUnit.pas:(.text+0x2d):undefined reference to 'deviceInitialize'

deviceInitialize - это функция возвращающая указатель на структуру.

Функции сама в библиотеке точно есть. Сама библиотека написана на С.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

функция примерно так объявлена?

Код: Выделить всё

function deviceInitialize: Pointer; cdecl; external;


а библиотека линкуется при сборке проекта?
anzo
новенький
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Сообщение anzo »

Библиотека вроде линкуется.
Функция объявлена так:
function deviceInitialize:Pdev_func;cdecl;external 'mydevlib' name 'deviceInitialize';

Добавлено спустя 3 минуты 50 секунд:
Исходники библиотеки есть. Собрал make' ом. расположил в /usr/lib, то что получилось.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

попробуй так:

Код: Выделить всё

function deviceInitialize:Pdev_func;cdecl;external 'mydevlib' name '_deviceInitialize';

или

Код: Выделить всё

function deviceInitialize:Pdev_func;cdecl;external 'mydevlib';

к экспортируемые cdecl функции в Сишных библиотеках, перед именем получают неявный префикс "_".

FreePascal знает об этом и, если внешенее имя cdecl-функции явно не указано, генерирует это имя добавляя необходимый префикс. Но если имя указано явно name '...', то он использует указанное.

Если я не ошибаюсь, то можно воспользовать утилитой nm, для просмотра экспортируемых функций (и их имён).

И ещё, как запасной вариант: скопировать библиотеку в папку с проектом.
anzo
новенький
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

Сообщение anzo »

Попробовал все вышесказанное, не помогает :(
Скорее всего, что то не то в библиотеке.
Выполнил команду
nm libmydevlib.so -g -C
В результате есть такая строка
00006d90 T deviceInitialize()

Добавлено спустя 18 часов 2 минуты 35 секунд:
Может выложить библиотечку куда-нибудь? Кто-нить будет смотреть что и как там?

Добавлено спустя 6 часов 58 минут 6 секунд:
Все получилось.
В общем поигрался с командой nm.
nm libmydevlib.so -D //Global data symbol
Выдала мне строку '_Z15deviceInitializev',
ее подставил в директиве и все прилинковалось.
Осталось теперь потестить, как работать будет. :D
Ответить