Совместимость C++ под Linux
Модератор: Модераторы
Совместимость C++ под Linux
Собираюсь портировать делфи программу на линукс.
Программа использует кросплатформенную опенсурс библиотеку на C++
Под виндой проблема решалась просто, библиотека компилировалась в dll и использовалась в программе.
У меня мало опыта в программировании под линукс, поэтому возникли следующие вопросы.
Как это дело перевести под линукс? Как использовать библиотеку из FreePascal?
Программа использует кросплатформенную опенсурс библиотеку на C++
Под виндой проблема решалась просто, библиотека компилировалась в dll и использовалась в программе.
У меня мало опыта в программировании под линукс, поэтому возникли следующие вопросы.
Как это дело перевести под линукс? Как использовать библиотеку из FreePascal?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
оказываетсья есть мануал
ftp://ftp.freepascal.org/pub/fpc/docs-p ... Pascal.pdf
в общем сам спросил и сам овтетил
ftp://ftp.freepascal.org/pub/fpc/docs-p ... Pascal.pdf
в общем сам спросил и сам овтетил
Приветствую!
А есть ли способ использовать код FPC в GCC под линукс. Дело в том что я с языком С не очень дружу пока.
Но мне нужно свой большой проект под FPC добавить в проект под GCC. Использование *.so файла для вызова функции FPC из GCC не желательно т.к. в свою очередь скомплированный на GCC *.so файл вызывается под JAVA.
В примере ftp://ftp.freepascal.org/pub/fpc/docs-p ... Pascal.pdf показано как использовать объектный файл C.
Можно ли использовать объектный файл FPC в С и каким образом создать для него *.h файл? и далее компилировать и линковать в GCC?
А есть ли способ использовать код FPC в GCC под линукс. Дело в том что я с языком С не очень дружу пока.
Но мне нужно свой большой проект под FPC добавить в проект под GCC. Использование *.so файла для вызова функции FPC из GCC не желательно т.к. в свою очередь скомплированный на GCC *.so файл вызывается под JAVA.
В примере ftp://ftp.freepascal.org/pub/fpc/docs-p ... Pascal.pdf показано как использовать объектный файл C.
Можно ли использовать объектный файл FPC в С и каким образом создать для него *.h файл? и далее компилировать и линковать в GCC?
Код fpc использовать в gcc достаточно легко, для этого существует
cdecl модификатор функций и {$PACKRECORDS C}, однако fpc код придется затачивать под gcc, ибо gcc ни чего не знает о fpc и заголовки, по всей видимости, придется делать вручную.
Типы лучше использовать из ctype.
Думаю проще будет сначала сделать C заголовки, а затем сгенерить из них код fpc при помощи h2pas, так что без знания C не обойтись ни как.
Линковать просто - gcc gcc.o fpc.o -o program.
Касательно c++ рекомендую почитать man c++filt.
К примеру посмотреть список вызовов в c++ библиотеке можно
так - nm libAAA.so | c++filt , конечно если только библиотека не striped или статическая.
cdecl модификатор функций и {$PACKRECORDS C}, однако fpc код придется затачивать под gcc, ибо gcc ни чего не знает о fpc и заголовки, по всей видимости, придется делать вручную.
Типы лучше использовать из ctype.
Думаю проще будет сначала сделать C заголовки, а затем сгенерить из них код fpc при помощи h2pas, так что без знания C не обойтись ни как.
Линковать просто - gcc gcc.o fpc.o -o program.
Касательно c++ рекомендую почитать man c++filt.
К примеру посмотреть список вызовов в c++ библиотеке можно
так - nm libAAA.so | c++filt , конечно если только библиотека не striped или статическая.
trifon писал(а):Код fpc использовать в gcc достаточно легко, для этого ...
Добрый день trifon.
Попробовал как ты посоветвовал, но мне кажется у меня пока опыта мало. GCC ошибку выдает при линковке. Выдает что не могу определить функцию add_m в процедуре main.
Пример кода
файл Hello.c
Код: Выделить всё
#include <stdio.h>
int main(void)
{
int a =2;
int b =3;
int c;
c=add_m(a,b);
printf("Privet. Hello world!\n");
printf("c= %i\n",c);
return(0);
}Сгенерированный файл на FPC.
файл test_c.pas
Код: Выделить всё
unit test_c;
interface
{
Automatically converted by H2Pas 1.0.0 from test_c.h
The following command line parameters were used:
test_c.h
}
{$IFDEF FPC}
{$PACKRECORDS C}
{$ENDIF}
{$ifndef _Included_test_c}
{$define _Included_test_c}
{ C++ extern C conditionnal removed }
function add_m(_para1:longint; _para2:longint):longint;
{ C++ end of extern C conditionnal removed }
{$endif}
implementation
function add_m(_para1:longint; _para2:longint):longint;
begin
{ You must implement this function }
result:=_para1+_para2;
end;
end.Компилирую на паскале этот файл, получаю файл test_c.o
Далее компилирую на gcc
Код: Выделить всё
gcc hello.c –cи линкую
Код: Выделить всё
gcc hello.o test_c.o –o progтут выдает ошибку что не может найти функцию add_m в процедуре main.
Пробовал разные варианты (менял код на с, провобовал объявлять extern, объявлял в файле *.h, и на паскале также - пробовал объявлять функцию в паскале как cdecl, менял опции компилятора FPC итд.
Все равно не смог линковать. Может я что то пропустил? Мне бы этот пример чтобы сработал, далее дело техники - добавлю свой код на паскале.
Версия FPC 2.0.4 под Дебиян. GCC кажется 4.1.3 ...
Спасибо заранее.
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
По поводу gcc gcc.o fpc.o -o program я наврал, извиняюсь.
Однако можно так:
fpc -CX tpas.pp
gcc tgcc.c libptpas.a -o program
естественно для fpc функций требуется cdecl; export;
в C программе надо объявить:
extern int add_m(int, int);
С данными изменениями у меня все компилируется и правильно работает.
Однако можно так:
fpc -CX tpas.pp
gcc tgcc.c libptpas.a -o program
естественно для fpc функций требуется cdecl; export;
в C программе надо объявить:
extern int add_m(int, int);
С данными изменениями у меня все компилируется и правильно работает.
Если обявлять как "cdecl; export", то получается и линкуется нормально.
Но это только для простых программ на поскале. Если я использую в модуле переменную string или работа с файлом (reset, append итд) у gcc и g++ не хочет линковать, требует еще куча доп. функции. Я подозреваю что это стандартные фукции которые в модуле system итд.
Попробовал добавить еще system.o, вылезло еще ссылки на другие функции/переменные из самой system.o.
В паскале есть опции когда можно все импортируемые функции из других модулей включить в объектный файл?
В моем проекте из нестандартных модулей используется classes где я использую Tstringlist и модул sysutils.
И еще вопрос. Когда компилиш как статистическую библиотеку его тоже нужно в дистрибутив включать как обычный *.so файл?
Всем заранее спасибо.
Но это только для простых программ на поскале. Если я использую в модуле переменную string или работа с файлом (reset, append итд) у gcc и g++ не хочет линковать, требует еще куча доп. функции. Я подозреваю что это стандартные фукции которые в модуле system итд.
Попробовал добавить еще system.o, вылезло еще ссылки на другие функции/переменные из самой system.o.
В паскале есть опции когда можно все импортируемые функции из других модулей включить в объектный файл?
В моем проекте из нестандартных модулей используется classes где я использую Tstringlist и модул sysutils.
И еще вопрос. Когда компилиш как статистическую библиотеку его тоже нужно в дистрибутив включать как обычный *.so файл?
Всем заранее спасибо.
