Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Почему меняются имена функций в библиотеке?


Автор: mantissa 20.5.2008, 16:40
Привет великий All!

поскажите плиз, может кто сталкивался...

код на С++ с использованием потоков, векторов и строк компилю в lib*****.a 
    g++ -fPIC -c ./../*.cpp -I$(Ph_PlatHdr)
    g++ -shared -o $(NmLibSoMT102) *.o  -lstdc++                             

или компилю и линкую в lib*****.so
    g++ -c ./../*.cpp -I$(Ph_PlatHdr)
    ar -r $(NmLibMT102) *.o

моя функция
int TreatMes_R(void *p1, void *p2)
{...}
прекрасно компилиться, но превращается в 
...
00000000001070c0 D pArField_MT102_01                              
00000000001070e0 D pArField_MT102_02                              
0000000000107100 D pArField_MT102_03                              
0000000000107120 D pArField_MT102_1N                              
                 U printf@@GLIBC_2.2.5                            
                 U qListSubFun                                    
                 U stdout@@GLIBC_2.2.5                            
                 U strlen@@GLIBC_2.2.5                            
                 U strncmp@@GLIBC_2.2.5                           
                 U strstr@@GLIBC_2.2.5                            
0000000000005922 t __tcf_0                                        
000000000000593c t __tcf_1                                        
                 U _Unwind_Resume@@GCC_3.0                        
00000000001080a0 B vData                                          
0000000000003ea0 T _Z10TreatMes_RPvS_                                       <<<-------- вот во что она превратилась!
0000000000004fb6 T _Z13CompareFieldsPcPvRS_Ri                     
0000000000005338 T _Z14TreatMT102F72APc                                         
00000000000049e4 T _Z18After_Block4_MT102PvP11MT102_All_q         
0000000000005870 t _Z41__static_initialization_and_destruction_0ii
00000000000055b8 T _Z6SeeMemPvm                                   
00000000000052c8 T _Z9ClearDataP11DescField_t                     
000000000000675e W _ZdlPvS_                                       
0000000000005e52 W _ZN9CData2SQLaSERKS_    
...

компиляция проекта не идет... линковщик не м. найти      TreatMes_R
но если в проекте подменить имя на   '_Z10TreatMes_RPvS_ ' то все прекрасно работает..

но это ведь называется сделать через ж@#у??
пока близиться 1-е тестирование брошу так smile но хотелось бы потом исправить на "по-человечески"... 
а то мои последователи на меня матом потом ругаться будут... пытаясь разобраться в этой чертовщине...

с ув. BSD

Добавлено через 2 минуты и 7 секунд

кстати... если  код просто Си-шный никаких проблем и подмен имен не происходит

Автор: MAKCim 20.5.2008, 17:14
компилятор С++ преобразует имена согласно сигнатуре и возвращаемому значению по определенному алгоритму (для обеспечения возможности перегрузки функций и т. д)
если хочешь использовать некоторые функции библиотеки, написанной на С++, в проекте на С, пометь их через extern "C"
Код

extern "C" int TreatMes_R(void *p1, void *p2)
{...}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)