LINUX.ORG.RU

Траблы со статической линковкой C++


0

0

В общем, такая проблема: есть большое C++ приложение, использующее несколько библиотек типа pthread, zlib, libdl. Компилируется оно GCC.
Мне хочется залинковать его статически, чтобы не было ссылок на libstd++ и libgcc.so, но ничего не получается.
Я играл с опциями -static и -static-libgcc, пробовал всяческие извраты типа -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic, но ничего не выходит.
В первом случае (-static) не находятся функции как раз из используемых библиотек:

................................
/usr/src/build/146482-i386/BUILD/gcc-3.2-20020903/obj-i386-redhat-linux/gcc/../.
./gcc/unwind-pe.h:61: undefined reference to `pthread_create'

Если просто сказать -static-libgcc, то все равно ldd выдает:

................................
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40089000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x4015d000)

При использовании -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic летит огромная простыня с неразресолвенными ссылками на basic_strib::* и прочей ботвы из STL. Комбинации этих опций дают те же результаты, только совмещенные.

В общем, отчаянное положение.

Кто-нибудь сталкивался с такой бедой? Помогите, плиииз...
Заранее благодарен.


anonymous

C++ компилят с помощью g++, а xxx.so - это динамические либы, а статические обычно - xxx.a, чтобы залинковать конкретно используют ключ -L (если не ошибаюсь)

PETER ★★
()
Ответ на: комментарий от PETER

C++ можно компилировать gcc - это просто типа враппер вокруг других компонент типа g++. Суть от этого не меняется. про .so и .a я знаю.
Вот как избавиться от libgcc и stdc+++ - это вопрос.
Я воткнул о оптионсы прямые пути до so-шек, линковка прошла, но теперь вообще какая-то лажа началась:

./myproga: /usr/lib/libc.so.1: bad ELF interpreter: No such file or directory

:(((((((((

Что делать? Я пробовал задать --dynamic-loader /lib/ld-linux.so.2 - та же фигня...

anonymous
()
Ответ на: комментарий от anonymous

Вау!!! Кул!!! Нашел нужные проперти! Кому интересно:

-Wl,-I,/lib/ld-linux.so.2 -static /lib/libc.so.6 /lib/libpthread.so.0 /lib/libdl.so.2 /usr/lib/libz.so

И все! stdc++ даже нигде указывать не нужно, только линковать via g++.

:)))

anonymous
()
Ответ на: комментарий от anonymous

>-Wl,-I,/lib/ld-linux.so.2 -static /lib/libc.so.6 /lib/libpthread.so.0 /lib/libdl.so.2 /usr/lib/libz.so

А чего так сложно то ? И зачем libdl для статически слинкованой программы ?

g++ ... -lz -pthread -static хватит за глаза ;)

sS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.