Создать статически связываемую библиотеку во Freepascal
Я планирую написать библиотеку в FPC, которая может быть связана с другими компиляторами. Динамическое связывание (.so, .dll) не является проблемой, однако возникло требование статического связывания от (по крайней мере) gcc и / или clang.
Каким-то образом, в конце концов, мне нужен архив объектов, содержащий все внутренние функции FPC, верно? Связывание с libc (cmem, cthreads и т. Д.) Вместо FPC, по-видимому, является требованием, но что еще может быть наиболее эффективным и кросс-платформенным способом для достижения этой цели?
FPC используется 2.7(магистраль).
Заранее спасибо.
РЕДАКТИРОВАТЬ: некоторый прогресс был достигнут здесь (немецкий, также см. Связанный репо в моем комментарии там), но это кажется мне не очень элегантным и простым. Также остается проблема, которую Марко поднял об инициализации / финализации...
2 ответа
У меня была похожая проблема, и я нашел этот урок действительно полезным. Он был в основном написан для разработки под iOS, что звучало бы намного сложнее, но довольно неплохо работало для обычных связей C/C++.
В моем случае для создания статической библиотеки использовался устаревший проект Delphi:
fpc -Cn -Mdelphi xxx.dpr
ar -q libxxx.a `grep "\.o$" link.res`
ranlib libxxx.a
Ну, теоретически вы связываете каждый.o вместе с AR, а затем вызываете FPC_INITIALIZEUNITS при запуске и FPC_FINALIZEUNITS при завершении работы.
Однако, возможно, FPC генерирует некоторую информацию (например, таблицу с адресами всех модулей ini/fin) в главном модуле. Я не могу быстро придумать решение для этого.