продолжаю экспериментировать с библиотеками (so) и С++.
добавляю в lib.cpp #include <iostream>. Компиляемся без проблем (но очень долго!!!). Запускаю экзешник, который сразу вываливается с сообщением
relocation error: lib.so: undefined symbol: __dso_handle
смотрим, что слинковалось
$:ld lib.so
lib.so: the `gets' function is dangerous and should not be used.
ld: warning: cannot find entry symbol _start; not setting start address
lib.so: undefined reference to `__dso_handle'
lib.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
lib.so: undefined reference to `operator delete(void*)'
lib.so: undefined reference to `__gxx_personality_v0'
lib.so: undefined reference to `_Unwind_Resume'
lib.so: undefined reference to `std::ios_base::Init::Init()'
lib.so: undefined reference to `vtable for __cxxabiv1::__class_type_info'lib.so: undefined reference to `std::ios_base::Init::~Init()'
lib.so: undefined reference to `operator new(unsigned)'
тихо фигею и лезу в гугл - о! флейм на gcc.gnu.org - чел пишет о такой же проблеме как и у меня, а в ответ невнятные рассуждения о ключах gcc и в конце концов, признание, мол, да проблема есть и мы ее пофиксили!
ставлю последние binutils (со всей байдой типа ld ar и прочей)
К сожалению не помогает - проблема остается.
Кто уже сталкивался с подобной фигней? Как лечится (не надо говорить о том, что писать надо на Си)?
ну и еще в догонку...
проблема появляется только после #include <iostream>. Если сделать #include <iostream.h> и заткнуть глотку компилятору -Wno-depricated - то все катит! Еще бит информации, пытаясь разобраться в переписке на gcc.gnu.org, нахожу, что __dso_handle должен быть определен в binutils/crtstuff.c - я взял последние сырцы - там нет такого файла и нигде нет такого символа...
ла здравствует коллективный разум и отдельное спасибо sergio_nsk - лечится все как в армии - единообразно - или йодом (если снаружи) или пеницилином (если внутри). Новые binutils + использование g++ - решает проблему (есть ощущение, что binutils новые и не требуются, но проверять уже не буду)
собственно как я понимаю помогло использование g++ вместо gcc,
произошло это потому, что при линковке gcc не может разобраться
в том, что это плюсовый код и надо подцеплять либу STL: -lstdc++
если компилировать и линковать сразу, то gcc догадывается по
расширению, что это на самом деле надо g++ обрабатывать, запускает грубо говоря g++, который автоматически прилинковывает
libstdc++ и все работает :)