Подтвердить что ты не робот

G++ linker: принудительное статическое связывание, если существует статическая библиотека?

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

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

Примечание. Я использовал параметр -static, но он пытается найти статический архив для всех библиотек, которые не то, что я хочу.

4b9b3361

Ответ 1

g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

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

Ответ 2

Если вы хотите статически связать одну или две библиотеки с остальными, включая системные библиотеки, будучи динамическими, часто проще просто ссылаться на статическую библиотеку по ее полному имени. Т.е. вместо того, чтобы использовать -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: для непосредственного указания библиотеки.

Ответ 3

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), статически связанный

Итак, это статически связано.