Можно провести следующий эксперимент:
Шаг 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