заставить gcc отдавать предпочтение статическим библиотекам совместно используемым объектам при компоновке? - PullRequest
19 голосов
/ 09 апреля 2011

При связывании с библиотеками с использованием опции -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, но это тоже не дало ожидаемых результатов

Ответы [ 3 ]

7 голосов
/ 09 апреля 2011

Вы можете указать полный путь к статическим библиотекам без флага -l для связи с ними.

gcc ... source.c ... /usr/lib32/libmysuperlib.a ...
5 голосов
/ 09 апреля 2011

Просто добавьте файл .a в строку ссылки без -l, как если бы это был файл .o.

2 голосов
/ 09 апреля 2011

Оно датировано, но может работать: http://www.network -theory.co.uk / docs / gccintro / gccintro_25.html

(почти конец страницы)

" Как отмечалось ранее, также можно напрямую связываться с отдельными файлами библиотеки, указав полный путь к библиотеке в командной строке. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...