Страница 1 из 1

надо скомпилять static libstdc++

Добавлено: 22 дек 2005, 04:11
unq
делаю так:

ln -s -f `g++ -print-file-name=libstdc++.a`

STDLIBS=$(STDLIB_PATH)/libpthread.so\
$(STDLIB_PATH)/libdl.so

LINK32=g++
LINK32_FLAGS=-L. -static-libgcc
LINK32_OBJS=object_files.o

exe_file: $(LINK32_OBJS)
$(LINK32) -o $@ $(LINK32_FLAGS) $(LINK32_OBJS) $(STDLIBS)

rm -f libstdc++.a

Что тут не так - все компиляется, но когда делаю это:
ldd exe_file - прлучаю вот такое:
libpthread.so.0 => /lib/libpthread.so.0 (0x402be000)
libdl.so.2 => /lib/libdl.so.2 (0x40311000)
libm.so.6 => /lib/libm.so.6 (0x40314000)
libc.so.6 => /lib/libc.so.6 (0x40336000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x4046f000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40522000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


Dct hfdyj tcnm libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x4046f000)!!!!!

Добавлено: 09 янв 2006, 01:08
unq
Не зна. - но может быть проблема была в следующем:

Мое приложение прльзовало староннюю динамическую библиотеку (xerces.so), которая в свою очередь при линковке тянула за собой libstdc++.so.5. Как только я перекомпилял xerces.so в xerces.а, те сделал static lib, то у меня все красиво скомпилялось- естественно вырос размер exe, но теперь уже ldd показывает, что libstdc++.so.5 не нужна...

Сам спросил - сам ответил, хотя родился другой вопрос:

действительно-ли при линковке *.so хочет другую *.so, и ни как не скомпиляется с *.a??

Добавлено: 09 янв 2006, 13:27
mend0za
если ваше приложение работает по сети - то переносе на машину с более другим libc со своей статической линковкой можете поймать массу проблем.

Добавлено: 09 янв 2006, 15:52
unq
mend0za писал(а):если ваше приложение работает по сети - то переносе на машину с более другим libc со своей статической линковкой можете поймать массу проблем.
я чего-то не понимаю наверное, но я статически компильнул libgcc для того что бы не было проблем при переноси exe на другой PC!!??
В частности были проблемы с gethostbyname. При переноси с RH9 на RHE4 было вроде SIGFAULT...

Добавлено: 09 янв 2006, 21:09
Pasha
LINK32_FLAGS=-L. -static-libgcc -static может?

Добавлено: 09 янв 2006, 23:04
mend0za
объясню по порядку:

залинковали вы libstdc++ и libc статически

но часть библиотек всё равно подгружается динамически из libc

и всё равно будут проблемы

так что универсального способа нет

только собрать под обе системы отдельные бинарники

Добавлено: 11 янв 2006, 02:57
unq
в общем я сделал так: нашел *.so которая при линковке тянула за собой libstdc++.so.5, хотя я и указал что libstdc++.so.5 надо компилять как static. Затем эту *.so заменил на *.a и она уже не тянет за собой libstdc++.so.5! Работает и на rh9 (2.4) и на rhe4 (2.6).

пока ни каких проблем с этим не было...

Добавлено: 11 янв 2006, 12:21
mend0za
проблемы могут возникнуть на разрешении имён (DNS)

Добавлено: 13 янв 2006, 19:35
unq
mend0za писал(а):проблемы могут возникнуть на разрешении имён (DNS)
так чего? чтобы не было проблем как надо компилять, чтобы была совместимость? Если вариан компиляции на обоих системах можно не рассматривать :), то остается ли возможность решить эту задачу??

Добавлено: 14 янв 2006, 03:44
mend0za
я говорю о проблемах при запуске, а не при компиляции


вопрос получения двух бинарников для разных систем в linux решается просто - делается chroot-каталог для целевой системы (то есть копия файлов с неё в подкаталог другой, либо с чистой инсталяции такой-же операционки)

далее - компиляция в chroot (см man chroot)