g ++ linker: принудительная статическая линковка, если статическая библиотека существует? - PullRequest
55 голосов
/ 13 сентября 2010

У меня есть программа, которая ссылается на многие библиотеки.g++ по умолчанию предпочитает ссылаться на общие библиотеки, даже если соответствующий архив существует.

Как изменить это предпочтение, чтобы предпочитать статические архивы динамическим библиотекам, если статический архив существует?

Обратите внимание, я использовал опцию -static, но он пытается найти статический архив для всех библиотек, а это не то, что мне нужно.

Ответы [ 2 ]

68 голосов
/ 13 сентября 2010
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

будет связывать zlib и libfoo как статические, а libbar как динамические.--as-needed удалит любую неиспользуемую динамическую библиотеку.

5 голосов
/ 04 октября 2016

Если вы хотите статически связать одну или две библиотеки с остальными, включая системные библиотеки, будучи динамическими, часто проще просто ссылаться на статическую библиотеку по ее полному имени.Т.е. вместо того, чтобы использовать -l и -L, чтобы получить g ++ для разрешения библиотеки из того, что она находит, просто добавьте полный путь к библиотеке в качестве входных данных.Взяв указанную выше команду g ++, чтобы связать основную программу приложения main.o со статическими libz и libfoo, а также с динамическими libbar, libglib и т. Д.* этот ответ , который более детален и предлагает альтернативный способ (-l:) для непосредственного указания библиотеки.

...