XProger написал:
Нук, по поводу libstdc++.so поподробнее... за что отвечает и как линковать её динамически? А получилось очень интересно. Vampyre для поддержки jpeg2000 линкует библиотеку OpenJpeg в виде внешних объектных файлов, скомпилированных в c++. Естественно, те зависят от сишной ртл, и в соотв. юните вампыра стояло {$linklib stdc++}. В фпц 2.2.0 всё прокатывало на ура. В фпц 2.2.2 полезли вопли линкера о не найденных символах. Поиск в гугле дал, что не хватает сишных математических библиотек. Я так понимаю, что от этого размер екзешников так и уменьшился: раньше фпц использовал сишные библиотеки, теперь - больше не использует.
Я плюнул, переделал тот юнит вампыра под динамическую загрузку, нашёл libopenjpeg.so, и стал грузить её. А она не грузится! dlopen() не срабатывает, и всё. Полез за объяснениями в dlerror(). Та сообщила, что не найден символ Floor. Полез в гугль. Получил: моя программа слинкована без сишных библиотек. Первый раз встречаю такую хрень, чтобы длл что-то ожидала найти в екзешнике %(
Стал рыть Инет дальше, и узнал о дополнительном параметре для dlopen()
Если упрощённо, то
- Код: Выделить всё
dll2:= dlopen(PChar(libstdc++.so.5), RTLD_NOW or RTLD_GLOBAL);
dll := dlopen(PChar(libopenjpeg.so), RTLD_NOW or RTLD_GLOBAL);
И вот это RTLD_GLOBAL заставляет дллы искать у друг дружки недостающие зависимости.
З.Ы. До этого мы обсуждали, почему у меня размеры исполняемых файлов в линуксе при переходе с 2.2.0 на 2.2.2 упали с 1700-1800 до 700-1100 килобайт.