Ответ 1
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed
Свяжет zlib
и libfoo
как статические, а libbar
- как динамические. --as-needed
удалит любую неиспользуемую динамическую библиотеку.
У меня есть программа, которая ссылается на многие библиотеки. g++
, по умолчанию, предпочитает ссылаться на разделяемые библиотеки, даже если соответствующий архив существует.
Как я могу изменить это предпочтение, предпочитая статические архивы через динамические библиотеки, если существует статический архив?
Примечание. Я использовал параметр -static
, но он пытается найти статический архив для всех библиотек, которые не то, что я хочу.
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed
Свяжет zlib
и libfoo
как статические, а libbar
- как динамические. --as-needed
удалит любую неиспользуемую динамическую библиотеку.
Если вы хотите статически связать одну или две библиотеки с остальными, включая системные библиотеки, будучи динамическими, часто проще просто ссылаться на статическую библиотеку по ее полному имени. Т.е. вместо того, чтобы использовать -l
и -l
чтобы получить g++ для разрешения библиотеки из того, что она находит, просто добавьте полный путь к библиотеке в качестве входных данных. Взяв указанную выше команду g++, чтобы связать основную программу приложения main.o
со статическими libz, libfoo, динамическими libbar, libglib и т.д.:
g++ main.o /usr/lib/libz.a /usr/lib/libfoo.a -lbar
Редактировать 3 августа 17: я только что ознакомился с этим ответом, который более -l:
и предлагает альтернативный способ (-l:
для непосредственного указания библиотеки.
g++ по умолчанию связывает динамические библиотеки. поэтому , мы должны установить какой-нибудь pkg.
gcc -o main main.cpp файл main
main: исполняемый 64-битный LSB ELF, x86-64, версия 1 (SYSV), динамически связанный (использует разделяемые библиотеки)
yum установить gcc-С++ glibc -static libstdc++ -static
И gcc
g++ -static -o main main.cpp
основной файл
main: исполняемый 64-разрядный LSB ELF, x86-64, версия 1 (GNU/Linux), статически связанный
Итак, это статически связано.