Совместимость C++ под Linux

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

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

Совместимость C++ под Linux

Сообщение Anonymouz » 02.09.2007 06:38:39

Собираюсь портировать делфи программу на линукс.
Программа использует кросплатформенную опенсурс библиотеку на C++
Под виндой проблема решалась просто, библиотека компилировалась в dll и использовалась в программе.
У меня мало опыта в программировании под линукс, поэтому возникли следующие вопросы.

Как это дело перевести под линукс? Как использовать библиотеку из FreePascal?
Anonymouz
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.09.2007 06:30:44

Сообщение Attid » 02.09.2007 11:07:56

а пробывал также как в дельфи ?
только библиатеку в *.so возьми.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Sergei I. Gorelkin » 02.09.2007 12:57:50

С++ библиотеку из Дельфи/FPC вызывать - тот еще геморрой. Но возможно, Qt тому яркий пример. Там вокруг каждой C++ ф-ции пишутся C-обертки, которые уже и вызываются обычным порядком.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение alexs » 02.09.2007 22:27:45

Delphi точно также не умеет линковать C++ классы (или я чего-то пропустил?) - поэтому отличий вобще быть не должно никаких - главное вашу c++ библиотек соберите под lin
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Anonymouz » 03.09.2007 12:45:33

в делфи я умудрялся прилинковать код написаный на MASM и скомпилиный в obj им же. (просто приходилось искать конвертор из масмавского obj в борандский)

это было под виндой

делал кажись так {$L file.obj}
и объявлял функции

но как это провернуть в FreePascal под линукс?
Anonymouz
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.09.2007 06:30:44

Сообщение alexs » 03.09.2007 13:50:27

наверное также - смотри в документации
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Иван Шихалев » 03.09.2007 14:05:22

Anonymouz писал(а):но как это провернуть в FreePascal под линукс?

Не конвертировать :) FPC использует тот же формат объектных файлов, что и GCC.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение Anonymouz » 13.09.2007 10:42:38

оказываетсья есть мануал

ftp://ftp.freepascal.org/pub/fpc/docs-p ... Pascal.pdf

в общем сам спросил и сам овтетил
Anonymouz
незнакомец
 
Сообщения: 3
Зарегистрирован: 02.09.2007 06:30:44

Сообщение ruslanch » 19.03.2008 23:54:41

Приветствую!

А есть ли способ использовать код FPC в GCC под линукс. Дело в том что я с языком С не очень дружу пока.
Но мне нужно свой большой проект под FPC добавить в проект под GCC. Использование *.so файла для вызова функции FPC из GCC не желательно т.к. в свою очередь скомплированный на GCC *.so файл вызывается под JAVA.

В примере ftp://ftp.freepascal.org/pub/fpc/docs-p ... Pascal.pdf показано как использовать объектный файл C.
Можно ли использовать объектный файл FPC в С и каким образом создать для него *.h файл? и далее компилировать и линковать в GCC?
ruslanch
незнакомец
 
Сообщения: 3
Зарегистрирован: 19.03.2008 23:41:27

Сообщение trifon » 20.03.2008 00:37:30

Код 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 или статическая.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение ruslanch » 25.03.2008 01:03:28

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 ...

Спасибо заранее.
ruslanch
незнакомец
 
Сообщения: 3
Зарегистрирован: 19.03.2008 23:41:27

Сообщение Иван Шихалев » 25.03.2008 10:50:21

Функцию следует объявить как "cdecl; export", в противном случае ее имя в o-файле не соответствует настоящему, да и cdecl, думаю, здесь необходим.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение trifon » 25.03.2008 15:43:47

По поводу 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);

С данными изменениями у меня все компилируется и правильно работает.
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение ruslanch » 27.03.2008 17:18:01

Если обявлять как "cdecl; export", то получается и линкуется нормально.

Но это только для простых программ на поскале. Если я использую в модуле переменную string или работа с файлом (reset, append итд) у gcc и g++ не хочет линковать, требует еще куча доп. функции. Я подозреваю что это стандартные фукции которые в модуле system итд.
Попробовал добавить еще system.o, вылезло еще ссылки на другие функции/переменные из самой system.o.

В паскале есть опции когда можно все импортируемые функции из других модулей включить в объектный файл?

В моем проекте из нестандартных модулей используется classes где я использую Tstringlist и модул sysutils.

И еще вопрос. Когда компилиш как статистическую библиотеку его тоже нужно в дистрибутив включать как обычный *.so файл?

Всем заранее спасибо.
ruslanch
незнакомец
 
Сообщения: 3
Зарегистрирован: 19.03.2008 23:41:27


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

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

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

Рейтинг@Mail.ru