создание gcc предпочитает статические библиотеки для общих объектов при связывании?

17

При связывании с библиотеками, использующими параметр -l (например, -lfoo ), gcc предпочтет общий объект для статической библиотеки, если они найдены (предпочитает libfoo.so to 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 , является обходным, но это не приятно.

Примечание:

  • да, я прочитал, как связать общие объекты & amp; библиотек, и я не пытаюсь создать файл, полностью статически связанный общий объект
  • да, я пробовал -Wl,-static -lfoo -Wl,-Bdynamic, , но не ожидал результатов
  • да, я тоже пытался -l:libfoo.a , но это не принесло ожидаемых результатов
задан Ákos Maróy 09.04.2011 в 11:12
источник

3 ответа

7

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

gcc ... source.c ... /usr/lib32/libmysuperlib.a ...
    
ответ дан Mat 09.04.2011 в 11:24
5

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

    
ответ дан Angelom 09.04.2011 в 11:24
2

Он устарел, но может работать: Ссылка

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

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

    
ответ дан h.z. 09.04.2011 в 11:42