При связывании с библиотеками с использованием опции -l
(скажем, -lfoo
), gcc предпочтет общий объект статической библиотеке, если обе найдены (предпочтение от libfoo.so
до libfoo.a
). Есть ли способ заставить gcc отдавать предпочтение статической библиотеке, если оба найдены?
Проблема, которую я пытаюсь решить, заключается в следующем: я создаю плагин для приложения (симулятор полета под названием X-Plane) со следующими ограничениями:
- плагин должен быть в форме 32-битного общего объекта, даже при работе в 64-битной системе
- рабочая среда не предоставляет удобный способ загрузки общих объектов, которые не находятся в «нормальных» местоположениях, скажем
/usr/lib
или /usr/lib32
:
- нельзя ожидать, что пользователь установит
LD_PRELOAD
или LD_LIBRARY_PATH
для поиска общих объектов, поставляемых с моим плагином
- среда выполнения X-Plane не добавит каталог моих плагинов в `` LD_LIBRARY_PATH, до динамической загрузки общего объекта плагина, что позволит мне отправить все необходимые общие объекты вместе с общим объектом плагина
- нельзя ожидать, что 64-разрядные пользователи установят 32-разрядные общие объекты, которые являются нетривиальными (скажем, не включены в пакет ia32-libs в Ubuntu)
Для устранения вышеуказанных ограничений возможное решение состоит в том, чтобы связать сгенерированный общий объект со статическими 32-битными версиями всех используемых нетривиальных библиотек. но при установке таких библиотек обычно устанавливаются как статические, так и динамические версии, и поэтому gcc всегда будет ссылаться на общий объект, а не на статическую библиотеку.
Конечно, перемещение / удаление / удаление общих объектов, о которых идет речь, и просто оставление статических библиотек, скажем, /usr/lib32
, это обходной путь, но это не очень хороший
Примечание:
- да, я читал о том, как связывать общие объекты и библиотеки, и я не пытаюсь создать «полностью статически связанный общий объект»
- да, я пытался
-Wl,-static -lfoo -Wl,-Bdynamic,
, но не принес ожидаемых результатов
- да, я тоже пробовал
-l:libfoo.a
, но это тоже не дало ожидаемых результатов