Сборка программы под Linux на FPC
Модератор: Модераторы
Сборка программы под Linux на FPC
Привет всем!
Собираю программу под 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 передает эту команду линкеру?
Настройки все по умолчанию.
Пасиба.
Собираю программу под 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 передает эту команду линкеру?
Настройки все по умолчанию.
Пасиба.
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 и в сторону какого модуля копать.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Банально не хватает одного (или нескольких) деверлоперского пакета*-delev*.rpm
Сам с этим мучался. Если линкер жалуется на что-то типа -lpthread, то нужно библиотеку libpthread.a
Можно попробовать найти libpthread.so и на его основе, с помощью libtool создать libpthread.a (сам не проверял, т.к. узнал после того, как меня данный вопрос стал не актуальным).
Если идет компиляция под линухом и для линуха, то просто нужно искать и устанавливать соответвующие devel пакеты. Если идет кросс-компиляция - затрудняюсь с ответом - но всё равно нужена соответсвующая библиотека.
Если решите проблему - отпишитесь, поделитесь опытом, хотя бы кратко - я проверю и включу в статью "Всё о компиляции и кросс-компиляции FreePascal", которую время от времени дописываю...
Ключь -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. (очень важно
) берёте бубен или активируете /dev/hands и /dev/head
4. компилируете и проверяете работоспособность - если повезёт, заработает
Сам с этим мучался. Если линкер жалуется на что-то типа -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. (очень важно
4. компилируете и проверяете работоспособность - если повезёт, заработает
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Можно провести следующий эксперимент:
Шаг 1.
Создаем папку dynlib и в ней ещё три подпапки: lib, prog и bin
Шаг 2.
В папке lib создаем файл mylib.pas следующего содержания:
Это наша динамическая библиотека.
Шаг 3.
В папке prog создаем файл prog.pas следующего содержания:
Это наша тестовая программа использующая библиотеку.
Шаг 4.
Под Window компилируем нашу библиотеку mymax:
Библиотека должна успешно скопилироваться
Шаг 5.
Продолжаем под Windows - компилируем нашу тестовую программу:
Все должно скомпилироваться.
Запускаем, и получаем сообщение об ошибке мол библиотека mymax не найдена.
Примечание: обратим внимание что, в папке dynlib/prog появился файл libimpprog.a
Шаг 6.
Ещё разок под Windows - копируем файлы dynlib/mymax/mymax.dll и dynlib/prog/prog.exe в папку dynlib/bin. После чего запускаем файл dynlib/bin/prog - программа работает.
Шаг 7.
Уже по Linux: компилируем нашу библиотеку mymax
Все должно успешно скомпилироваться, так же как и под Windows
Шаг 8.
Продолжаем под Linux: пытаемся компилировать нашу программу:
И получем сообщение
Вот здесь проявилось кореное отличие Windows и Linux: указаная выше в примечании библиотека автоматически не создавалась (почему? читай статью "Разделяемые библиотеки (shared libraries)", ссылка в конце)
Шаг 9.
Под Linux: Копируем dynlib/lib/libmymax.so в папку dynlib/prog и снова пытаемся компилировать тестовую программу - на этот раз должно быть успешно. Запускаем и получаем ошибку:
Почему? Потому, что библиотека не ищется в текущем каталоге. Ради эксперимента, скопируем dynlib/lib/mymax.so к примеру в /usr/lib. Снова запускаем dynlib/prog/prog - теперь должно сработать.
Примечание: не забудем удалить более не нужный /usr/lib/libmymax.so
Шаг 10.
Возвращаемся в Windows. Компилруем dynlib/lib/mymax.pas под Linux:
Должно быть успешно (если всё настроено)
Компилируем dynlib/prog/mymax.pas (но сначала удалим всё кроме mymax.pas из этой папки - если там что-то уже успело появиться)
Опять получаем ошибку как было под линухом на шаге 8, лечиться также или можно не копировать, а просто указать ключом -Fl где нужно искать библиотеку (также можно было поступить на шаге
:
Всё должно скомплироваться. Проверяем аналогично как на шаге 9.
Что делать дальше? мне тоже интересно...
[1]. Разделяемые библиотеки (shared libraries)
http://www.opennet.ru/base/dev/shared_l ... o.txt.html
Шаг 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 где нужно искать библиотеку (также можно было поступить на шаге
Код: Выделить всё
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 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
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 писал(а):AlexSuv писал(а):Насколько я сейчас понимаю компилятору тупо не хватает libpthread.a, котрого я ни где не могу найти. Есть надежда что с ним должно все откомпилироваться.
Я не уверен, что именно libpthread.a, может libpthread.so (уже крыша едит, про DLLHell слышал много, не так и не понял в чём суть, зато про SOHell не слышал, но крыша едет - может кто-нибудь всё-таки распутает ситуацию)
Попробуй для начала так: найди в линухе libpthread.so и скопируй её в папку с проектом - авось заработает.
Уже пробовал, фанарь
Вообще пишут что библиотека libpthread.a это дополнение к libc и должна как-то создаваться при компиляции заданием опции -lpthread, но у меня что-то не вышло.
Подсунул компилятору 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
вот таким образом откомпилировалось:
ppc386.exe -Tlinux -XPi386-linux- -Xc httpget.pas
(без параметра -Xc выдает ошибки, мол undefined reference to)
Однако при запуске выдает ошибку: "segmentation fault".
Откомпилированный в win32 для линукса файл получился размером 1900 кб против 900 кб откомпилированного непосредственно в линуксе.
При чем я заметил вместо libpthread.a с опцией -Xc компилятору можно подсунуть хоть своп от винды, схавает.
Где же грабли и где cкачать правильный libpthread.a
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Под линухом скомпилировалось? работает?
А подробнее, что там undefined...
Если libpthread использует другую библиотеку, например туже libc, то она вроде также должна присутствовать. Вобщем нужны все библиотеки используемые непосредсвенно, и вподе все используемые косвенно...
AlexSuv писал(а):выдает более отсмысленные типа: "undefined reference to:" ... что говорит что мы на верном пути, и просто библиотека немного не подходит,
А подробнее, что там undefined...
Если libpthread использует другую библиотеку, например туже libc, то она вроде также должна присутствовать. Вобщем нужны все библиотеки используемые непосредсвенно, и вподе все используемые косвенно...
