Сборка программы под Linux на FPC

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

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

Сборка программы под Linux на FPC

Сообщение Rain » 10.01.2007 14:43:45

Привет всем!

Собираю программу под W32 для W32 на FPC: все отлично линкуется, компилится. Собираю программу род Linux для Linux, под W32 для Linux: постоянно появляется одна и та же ошибка.

Free Pascal Compiler version 2.0.4 [2006/08/21] for i386
Copyright (c) 1993-2006 by Florian Klaempfl
Target OS: Linux for i386
Compiling d:\hpt\rss2fido\rss2fido.pas
Linking d:\hpt\rss2fido\out\rss2fido
D:\PROG_ING\FPC\bin\i386-linux\ld.exe: cannot find -ldl
rss2fido.pas(195,1) Error: Error while linking

А, конечно, понимаю, что линкер не может найти -ldl, но зачем FPC передает эту команду линкеру?
Настройки все по умолчанию.
Пасиба.
Rain
новенький
 
Сообщения: 21
Зарегистрирован: 19.10.2006 03:12:00

Сообщение Alexander » 12.01.2007 01:59:19

Может глупый вопрос, а сам линкер есть (физически) ?
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 821
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Сообщение Rain » 12.01.2007 06:36:08

Alexander писал(а):Может глупый вопрос, а сам линкер есть (физически) ?


Да. Линкер есть.
...\bin\i386-linux\ld.exe
-------------------
Rain
новенький
 
Сообщения: 21
Зарегистрирован: 19.10.2006 03:12:00

Сообщение AlexSuv » 02.09.2007 16:47:30

Rain, удалось ли решить проблему?

Если да, то как? У меня то же самое.


то cannot find -ldl,
то cannot find -lpthread,

пытаюсь откомпилировать простейший проект с компонентами Indy под линукс. Под win32 все проекрастно компилируется, а вот под линукс ни в какую :(
AlexSuv
новенький
 
Сообщения: 16
Зарегистрирован: 02.09.2007 04:22:12

Сообщение Attid » 02.09.2007 18:09:11

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

Сообщение AlexSuv » 02.09.2007 18:12:19

Attid писал(а):кроскомпиляция ?
нехватает библиатек
в поиск в FAQ ветки fpc.

Факи все перечитал. Кросскомпиляция из win32 в linux работает нормально до тех пор, пока не подключаю библиотеки из indy (idhttp). И тогда вылазит эта хрень.
AlexSuv
новенький
 
Сообщения: 16
Зарегистрирован: 02.09.2007 04:22:12

Сообщение Matich » 02.09.2007 18:49:13

Из линукса пробовал собирать?
Matich
новенький
 
Сообщения: 50
Зарегистрирован: 25.07.2007 21:42:57

Сообщение AlexSuv » 02.09.2007 18:54:35

Matich писал(а):Из линукса пробовал собирать?

Да, только что попробовал, непосредственно в линуксе все собралось, но мне надо собирать именно из win32. :(

Код простейший:

Код: Выделить всё
Uses classes,idhttp;
Var
   ht : TidHttp;
   ms : TMemoryStream;
begin
  ht := TidHttp.Create;
  ms := TMemoryStream.Create;
  ht.get('http://www.microsoft.com',ms);
  ms.SaveToFile('xxx.htm');
  ms.free;
  ht.free;
End.


Библиотеки стоят кросплатформенные и без indy все собирается вод линукс нормально.

Подскажите хотя бы что такое -lpthread и в сторону какого модуля копать.
AlexSuv
новенький
 
Сообщения: 16
Зарегистрирован: 02.09.2007 04:22:12

Сообщение shade » 02.09.2007 20:40:35

Банально не хватает одного (или нескольких) деверлоперского пакета*-delev*.rpm
Сам с этим мучался. Если линкер жалуется на что-то типа -lpthread, то нужно библиотеку libpthread.a
Можно попробовать найти libpthread.so и на его основе, с помощью libtool создать libpthread.a (сам не проверял, т.к. узнал после того, как меня данный вопрос стал не актуальным).

Если идет компиляция под линухом и для линуха, то просто нужно искать и устанавливать соответвующие devel пакеты. Если идет кросс-компиляция - затрудняюсь с ответом - но всё равно нужена соответсвующая библиотека.

Если решите проблему - отпишитесь, поделитесь опытом, хотя бы кратко - я проверю и включу в статью "Всё о компиляции и кросс-компиляции FreePascal", которую время от времени дописываю...

AlexSuv писал(а):Подскажите хотя бы что такое -lpthread и в сторону какого модуля копать.

Ключь -l указывает на небходимость подключения библиотеки, в данном случае pthread, добавляем префикс lib и суффикс .a используемые под линухом (под windows префикс пустой, суффикс .dll, библиотека *.a - не требуется, т.к. генерируется самим fpc, покрайней мере в последних версиях), получаем имя файла libpthread.a, или libpthread.so, вот их и не хватает.

Можно обойтись следующим хаком:
1. находите библиотеку (начните с каталога /lib) с именем типа libpthread-2.3.6.so или libpthread.so.0 и т.п.
2. создаете символическую ссылку с именем libpthread.so на найденую библиотеку
3. (очень важно :lol: ) берёте бубен или активируете /dev/hands и /dev/head
4. компилируете и проверяете работоспособность - если повезёт, заработает :roll:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение shade » 02.09.2007 22:53:48

Можно провести следующий эксперимент:

Шаг 1.
Создаем папку dynlib и в ней ещё три подпапки: lib, prog и bin

Шаг 2.
В папке lib создаем файл mylib.pas следующего содержания:
Код: Выделить всё
library mymax;

function max(a, b: Integer): Integer; export;
begin
  if a > b then max := a
  else max := b;
end;

exports
  max;

end.

Это наша динамическая библиотека.

Шаг 3.
В папке prog создаем файл prog.pas следующего содержания:
Код: Выделить всё
program prog;

function max(a, b: Integer): Integer; external 'mymax' name 'max';

var
  a, b: Integer;
begin
  writeln('Введите два числа:');
  write('a = '); readln(a);
  write('b = '); readln(b);
  writeln('max(', a, ', ', b, ') = ', max(a,b));
end.

Это наша тестовая программа использующая библиотеку.

Шаг 4.
Под Window компилируем нашу библиотеку mymax:
Код: Выделить всё
cd dynlib/lib
fpc mymax

Библиотека должна успешно скопилироваться

Шаг 5.
Продолжаем под Windows - компилируем нашу тестовую программу:
Код: Выделить всё
cd dynlib/prog
fpc prog

Все должно скомпилироваться.
Запускаем, и получаем сообщение об ошибке мол библиотека mymax не найдена.
Примечание: обратим внимание что, в папке dynlib/prog появился файл libimpprog.a

Шаг 6.
Ещё разок под Windows - копируем файлы dynlib/mymax/mymax.dll и dynlib/prog/prog.exe в папку dynlib/bin. После чего запускаем файл dynlib/bin/prog - программа работает.

Шаг 7.
Уже по Linux: компилируем нашу библиотеку mymax
Код: Выделить всё
cd dynlib/lib
fpc mymax

Все должно успешно скомпилироваться, так же как и под Windows

Шаг 8.
Продолжаем под Linux: пытаемся компилировать нашу программу:
Код: Выделить всё
cd dynlib/prog
fpc prog

И получем сообщение
Код: Выделить всё
Linking prog
/usr/bin/ld: cannot find -lmymax
prog.pp(12,1) Error: Error while linking

Вот здесь проявилось кореное отличие Windows и Linux: указаная выше в примечании библиотека автоматически не создавалась (почему? читай статью "Разделяемые библиотеки (shared libraries)", ссылка в конце)

Шаг 9.
Под Linux: Копируем dynlib/lib/libmymax.so в папку dynlib/prog и снова пытаемся компилировать тестовую программу - на этот раз должно быть успешно. Запускаем и получаем ошибку:
Код: Выделить всё
./prog: error while loading shared libraries: libmymax.so: cannot open shared object file: No such file or directory

Почему? Потому, что библиотека не ищется в текущем каталоге. Ради эксперимента, скопируем dynlib/lib/mymax.so к примеру в /usr/lib. Снова запускаем dynlib/prog/prog - теперь должно сработать.
Примечание: не забудем удалить более не нужный /usr/lib/libmymax.so

Шаг 10.
Возвращаемся в Windows. Компилруем dynlib/lib/mymax.pas под Linux:
Код: Выделить всё
cd dynlib/lib
fpc -Tlinux mymax

Должно быть успешно (если всё настроено)
Компилируем dynlib/prog/mymax.pas (но сначала удалим всё кроме mymax.pas из этой папки - если там что-то уже успело появиться)
Код: Выделить всё
cd dynlib/prog
fpc -Tlinux prog

Опять получаем ошибку как было под линухом на шаге 8, лечиться также или можно не копировать, а просто указать ключом -Fl где нужно искать библиотеку (также можно было поступить на шаге 8):
Код: Выделить всё
cd dynlib/prog
fpc -Tlinux -Fl../lib prog

Всё должно скомплироваться. Проверяем аналогично как на шаге 9.

Что делать дальше? мне тоже интересно...

[1]. Разделяемые библиотеки (shared libraries)
http://www.opennet.ru/base/dev/shared_l ... o.txt.html
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение AlexSuv » 02.09.2007 22:57:05

shade Спасибо за ответы, ты подтолкнул меня к решению задачи.

Насколько я сейчас понимаю компилятору тупо не хватает libpthread.a, котрого я ни где не могу найти. Есть надежда что с ним должно все откомпилироваться.
AlexSuv
новенький
 
Сообщения: 16
Зарегистрирован: 02.09.2007 04:22:12

Сообщение shade » 02.09.2007 23:29:01

AlexSuv писал(а):Насколько я сейчас понимаю компилятору тупо не хватает libpthread.a, котрого я ни где не могу найти. Есть надежда что с ним должно все откомпилироваться.

Я не уверен, что именно libpthread.a, может libpthread.so (уже крыша едит, про DLLHell слышал много, но так и не понял в чём суть, зато про SOHell не слышал, но крыша едет - может кто-нибудь всё-таки распутает ситуацию)

Попробуй для начала так: найди в линухе libpthread.so и скопируй её в папку с проектом - авось заработает.

Для компиляции под линухом для линуха, нужно просто установить пакет linuxthreads-devel (там и лежит pthread), в ASPLinux 11.2 это пакет linuxthreads-devel-2.3.6-3asp.i386.rpm (есть на диске)

Для кросс-компиляции просто установи указанный пакет, найди нужные библиотеки, закинь их проект или какую-другую папку (но тогда укажет путь с помощью -Fl)
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение AlexSuv » 02.09.2007 23:33:49

shade писал(а):
AlexSuv писал(а):Насколько я сейчас понимаю компилятору тупо не хватает libpthread.a, котрого я ни где не могу найти. Есть надежда что с ним должно все откомпилироваться.

Я не уверен, что именно libpthread.a, может libpthread.so (уже крыша едит, про DLLHell слышал много, не так и не понял в чём суть, зато про SOHell не слышал, но крыша едет - может кто-нибудь всё-таки распутает ситуацию)

Попробуй для начала так: найди в линухе libpthread.so и скопируй её в папку с проектом - авось заработает.

Уже пробовал, фанарь :(. Хотя сейчас вместо злостного сообщения, выдает более отсмысленные типа: "undefined reference to:" ... что говорит что мы на верном пути, и просто библиотека немного не подходит, а я их уже перепробовал несколько, в т.ч. и libpthread.so

Вообще пишут что библиотека libpthread.a это дополнение к libc и должна как-то создаваться при компиляции заданием опции -lpthread, но у меня что-то не вышло.
AlexSuv
новенький
 
Сообщения: 16
Зарегистрирован: 02.09.2007 04:22:12

Сообщение AlexSuv » 03.09.2007 00:20:16

Подсунул компилятору libpthread.a

вот таким образом откомпилировалось:
ppc386.exe -Tlinux -XPi386-linux- -Xc httpget.pas
(без параметра -Xc выдает ошибки, мол undefined reference to)

Однако при запуске выдает ошибку: "segmentation fault".
Откомпилированный в win32 для линукса файл получился размером 1900 кб против 900 кб откомпилированного непосредственно в линуксе.

При чем я заметил вместо libpthread.a с опцией -Xc компилятору можно подсунуть хоть своп от винды, схавает.

Где же грабли и где cкачать правильный libpthread.a
AlexSuv
новенький
 
Сообщения: 16
Зарегистрирован: 02.09.2007 04:22:12

Сообщение shade » 03.09.2007 10:47:07

Под линухом скомпилировалось? работает?

AlexSuv писал(а):выдает более отсмысленные типа: "undefined reference to:" ... что говорит что мы на верном пути, и просто библиотека немного не подходит,

А подробнее, что там undefined...
Если libpthread использует другую библиотеку, например туже libc, то она вроде также должна присутствовать. Вобщем нужны все библиотеки используемые непосредсвенно, и вподе все используемые косвенно...
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

След.

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

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

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

Рейтинг@Mail.ru