Опять преобразование H файлов
Модератор: Модераторы
Опять преобразование H файлов
Проблема при преобразовании сишных H фалов в pascal форму.
Один из H фалов содержит ссылку на файл time.h в котором хранится структура tm.
На какой файл мне ссылаться в fpc?
Нашел такой файл
fpc\2.2.4\source\packages\libc\src\timeh.inc
Пишу в начале
{$i timeh.inc}
все равное не собирается.
Один из H фалов содержит ссылку на файл time.h в котором хранится структура tm.
На какой файл мне ссылаться в fpc?
Нашел такой файл
fpc\2.2.4\source\packages\libc\src\timeh.inc
Пишу в начале
{$i timeh.inc}
все равное не собирается.
anzo писал(а):Пишу в начале
{$i timeh.inc}
все равное не собирается.
в сконвертированный файл добавь в секцию uses модуль libc.
использовать модуль libc не очень хорошо, но вреда большого не должно принести.
разумеется {$i timeh.inc} нужно убрать
p.s. если возникнут ещё проблемы с конвертированием, пожалуйста, не создавай дополнительных тем, пиши в этой
Ок. С открытием новой темы поторопился... Надо было в старую писать.
Libc добавил в uses. Но компилятор ее не видит, нужно добавить в пути поиска
fpc\2.2.4\source\packages\libc\src\
fpc\2.2.4\source\rtl\unix\
fpc\2.2.4\source\rtl\linux\
....
?
Libc добавил в uses. Но компилятор ее не видит, нужно добавить в пути поиска
fpc\2.2.4\source\packages\libc\src\
fpc\2.2.4\source\rtl\unix\
fpc\2.2.4\source\rtl\linux\
....
?
правильно ли я понимаю, операционка - windows?
Пока собираю на Windows, а работать должна на Linux.
А что есть разница в использовании библиотек В Lazarus'e под win32 и linux?
То есть проверить правильно ли я разрабатываю я приложение для линукса под виндой не получится?
А что есть разница в использовании библиотек В Lazarus'e под win32 и linux?
То есть проверить правильно ли я разрабатываю я приложение для линукса под виндой не получится?
anzo
Если хотите проверять правильность работы то необходимо это делать на нативной системе.
Если хотите проверять правильность работы то необходимо это делать на нативной системе.
просто проблема в том, что
скорее всего не скомпилируется на Винде, потому что модуль libc не компилируется под винду.
Зато на Linux-е всё должно получиться!
как вариант предлагаю просто скопировать объявление типа tm в портируемый файл, что-то вроде
Код: Выделить всё
uses libc;
скорее всего не скомпилируется на Винде, потому что модуль libc не компилируется под винду.
Зато на Linux-е всё должно получиться!
как вариант предлагаю просто скопировать объявление типа tm в портируемый файл, что-то вроде
Код: Выделить всё
{$ifdef Unix}
uses libc;
{$endif}
{$ifdef MSWindows}
{libc types. todo: use libc}
type
tm = packed record
...
end;
{$endif}
Хорошо, спасибо за совет попробую!
Вернулся я снова к этой задаче. Все выше указанное сделал на Ubunte+Lazarus.
Столкнулся со следующей проблемой при линковании ругается.
MainUnit.pas:(.text+0x2d):undefined reference to 'deviceInitialize'
deviceInitialize - это функция возвращающая указатель на структуру.
Функции сама в библиотеке точно есть. Сама библиотека написана на С.
Столкнулся со следующей проблемой при линковании ругается.
MainUnit.pas:(.text+0x2d):undefined reference to 'deviceInitialize'
deviceInitialize - это функция возвращающая указатель на структуру.
Функции сама в библиотеке точно есть. Сама библиотека написана на С.
функция примерно так объявлена?
а библиотека линкуется при сборке проекта?
Код: Выделить всё
function deviceInitialize: Pointer; cdecl; external;
а библиотека линкуется при сборке проекта?
Библиотека вроде линкуется.
Функция объявлена так:
function deviceInitialize:Pdev_func;cdecl;external 'mydevlib' name 'deviceInitialize';
Добавлено спустя 3 минуты 50 секунд:
Исходники библиотеки есть. Собрал make' ом. расположил в /usr/lib, то что получилось.
Функция объявлена так:
function deviceInitialize:Pdev_func;cdecl;external 'mydevlib' name 'deviceInitialize';
Добавлено спустя 3 минуты 50 секунд:
Исходники библиотеки есть. Собрал make' ом. расположил в /usr/lib, то что получилось.
попробуй так:
или
к экспортируемые cdecl функции в Сишных библиотеках, перед именем получают неявный префикс "_".
FreePascal знает об этом и, если внешенее имя cdecl-функции явно не указано, генерирует это имя добавляя необходимый префикс. Но если имя указано явно name '...', то он использует указанное.
Если я не ошибаюсь, то можно воспользовать утилитой nm, для просмотра экспортируемых функций (и их имён).
И ещё, как запасной вариант: скопировать библиотеку в папку с проектом.
Код: Выделить всё
function deviceInitialize:Pdev_func;cdecl;external 'mydevlib' name '_deviceInitialize';
или
Код: Выделить всё
function deviceInitialize:Pdev_func;cdecl;external 'mydevlib';
к экспортируемые cdecl функции в Сишных библиотеках, перед именем получают неявный префикс "_".
FreePascal знает об этом и, если внешенее имя cdecl-функции явно не указано, генерирует это имя добавляя необходимый префикс. Но если имя указано явно name '...', то он использует указанное.
Если я не ошибаюсь, то можно воспользовать утилитой nm, для просмотра экспортируемых функций (и их имён).
И ещё, как запасной вариант: скопировать библиотеку в папку с проектом.
Попробовал все вышесказанное, не помогает
Скорее всего, что то не то в библиотеке.
Выполнил команду
nm libmydevlib.so -g -C
В результате есть такая строка
00006d90 T deviceInitialize()
Добавлено спустя 18 часов 2 минуты 35 секунд:
Может выложить библиотечку куда-нибудь? Кто-нить будет смотреть что и как там?
Добавлено спустя 6 часов 58 минут 6 секунд:
Все получилось.
В общем поигрался с командой nm.
nm libmydevlib.so -D //Global data symbol
Выдала мне строку '_Z15deviceInitializev',
ее подставил в директиве и все прилинковалось.
Осталось теперь потестить, как работать будет.
Скорее всего, что то не то в библиотеке.
Выполнил команду
nm libmydevlib.so -g -C
В результате есть такая строка
00006d90 T deviceInitialize()
Добавлено спустя 18 часов 2 минуты 35 секунд:
Может выложить библиотечку куда-нибудь? Кто-нить будет смотреть что и как там?
Добавлено спустя 6 часов 58 минут 6 секунд:
Все получилось.
В общем поигрался с командой nm.
nm libmydevlib.so -D //Global data symbol
Выдала мне строку '_Z15deviceInitializev',
ее подставил в директиве и все прилинковалось.
Осталось теперь потестить, как работать будет.
