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

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

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

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

Сообщение anzo » 04.12.2009 20:25:19

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

Пишу в начале
{$i timeh.inc}
все равное не собирается.
anzo
новенький
 
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

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

Сообщение скалогрыз » 05.12.2009 01:37:23

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

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

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

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

p.s. если возникнут ещё проблемы с конвертированием, пожалуйста, не создавай дополнительных тем, пиши в этой ;)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение anzo » 05.12.2009 13:03:43

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

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

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

Сообщение скалогрыз » 05.12.2009 23:28:07

правильно ли я понимаю, операционка - windows?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение anzo » 07.12.2009 21:49:43

Пока собираю на Windows, а работать должна на Linux.
А что есть разница в использовании библиотек В Lazarus'e под win32 и linux?
То есть проверить правильно ли я разрабатываю я приложение для линукса под виндой не получится?
anzo
новенький
 
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

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

Сообщение Mr.Smart » 07.12.2009 22:16:08

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

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

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

просто проблема в том, что
Код: Выделить всё
uses libc;

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

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

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


{$ifdef MSWindows}
{libc types. todo: use libc}
type
  tm = packed record
     ...
  end;
{$endif}
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение anzo » 07.12.2009 23:25:17

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

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

Сообщение anzo » 12.12.2009 21:32:51

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

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

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

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

Сообщение скалогрыз » 12.12.2009 21:39:48

функция примерно так объявлена?
Код: Выделить всё
function deviceInitialize: Pointer; cdecl; external;


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

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

Сообщение anzo » 12.12.2009 22:31:36

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

Добавлено спустя 3 минуты 50 секунд:
Исходники библиотеки есть. Собрал make' ом. расположил в /usr/lib, то что получилось.
anzo
новенький
 
Сообщения: 28
Зарегистрирован: 09.07.2009 10:53:46

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

Сообщение скалогрыз » 13.12.2009 12:14:03

попробуй так:
Код: Выделить всё
function deviceInitialize:Pdev_func;cdecl;external 'mydevlib' name '_deviceInitialize';

или
Код: Выделить всё
function deviceInitialize:Pdev_func;cdecl;external 'mydevlib';

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

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

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

И ещё, как запасной вариант: скопировать библиотеку в папку с проектом.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

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

Сообщение anzo » 13.12.2009 22:10:09

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

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

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


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

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

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

Рейтинг@Mail.ru