making gcc prefer static libs to shared objects when linking?

When linking against libraries using the -l option (say -lfoo), gcc will prefer a shared object to a static library if both are found (will prefer libfoo.so to libfoo.a). Is there a way to make gcc prefer the static library, if both are found?

The issue I'm trying to solve is the following: I'm creating a plugin for an application (the flight simulator called X-Plane), with the following constraints:

  • the plugin is to be in the form of a 32 bit shared object, even when running on a 64 bit system
  • the running environment does not provide a convenient way to load shared objects which are not in the 'normal' locations, say /usr/lib or /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 тоже, но это тоже не дало ожидаемых результатов
22
задан 0xC0000022L 26 September 2012 в 12:33
поделиться