Проблема, с которой я столкнулся, немного сложна для объяснения, но я постараюсь изложить ее проще (у меня больше нет идей о том, как ее решить).
Ну, в общем, мыУ меня очень большой проект C ++ на Linux.Этот проект был скомпилирован с make-файлами, но в новой версии мы переносим его в CMake.Версия CMake компилируется нормально, но поведение при загрузке библиотеки немного отличается.
Вот сценарий: у меня есть папка со следующими файлами:
/appserver/appserver_cmake (the binary compiled using cmake)
/appserver/appserver_original (the binary compiled using the makefiles)
/appserver/dbsrv.so (the library the program is trying to load)
Существует класс с именем "tTOPClient", который компилируется внутри исполняемого файла и внутри библиотеки.Идея такова: если библиотека существует, программа должна выполнять функции внутри библиотеки.В противном случае он должен выполнить свою собственную функцию.
Вот стек при выполнении appserver_original:
bAdvplConn=0 '\000') at ../fatclient/clientconn.cpp:260
#1 0xb6396fe2 in tTOPClient::m4GLConnect (this=0x2075d858, server=0x2075e3d4 "(local)", environment=0x2075e404 "ORACLE",
user=0x203c6731 "user") at ../fatclient/clientconn.cpp:255
#2 0xb63a0f1d in v40TC_m4GLConnect (who=0x2075d858, toServer=0x2075e3d4 "(local)", init_prm=0x2075e404 "@!!@ORACLE/ora10g_v1002t", usr=0x203c6731 "user")
at ../fatclient/topapi40.cpp:63
#3 0x0866e49c in tTopDriver::APTC_Connect (this=0x2075e4d0, who=0x2075d858, toServer=0x2075e3d4 "(local)", conn_str=0x2075e404 "ORACLE",
usrname=0x203c6731 "user", nSeed=-1230926992) at ./lib/top.cpp:3718
#4 0x0866d0eb in tTopDriver::Connect (this=0x2075e4d0) at ./lib/top.cpp:3314
В итоге, последовательность вызовов:
tTopDriver::Connect (inside the executable)
tTopDriver::APTC_Connect (inside the executable, will call a library's function)
v40TC_m4GLConnect (inside the library)
tTOPClient::m4GLConnect (inside the library)
Когда я запускаю «appserver_cmake», «APTC_Connect» вызывает библиотеку «v40TC_m4GLConnect», но эта функция называется «tTOPClient :: m4GLConnect», которая находится внутри исполняемого файла, а не та, что внутри самого себя.
Вот стек:
bAdvplConn=0 '\000') at /home/user/adv/trunk/topconnect/4.0/client/clientconn.cpp:207
#1 0x08abe8d2 in tTOPClient::m4GLConnect (this=0x20a1d528, server=0x20a1d78c "(local)", environment=0x20a1ffcc "ORACLE",
user=0x20600c69 "user") at /home/user/adv/trunk/topconnect/4.0/client/clientconn.cpp:202
#2 0xae1a0f1d in v40TC_m4GLConnect (who=0x20a1d528, toServer=0x20a1d78c "(local)", init_prm=0x20a1ffcc "ORACLE", usr=0x20600c69 "user")
at ../fatclient/topapi40.cpp:63
#3 0x08982730 in tTopDriver::APTC_Connect (this=0x209f0780, who=0x20a1d528, toServer=0x20a1d78c "(local)", conn_str=0x20a1ffcc "ORACLE",
usrname=0x20600c69 "user", nSeed=-1335784592) at /home/user/adv/trunk/lib/top.cpp:3718
#4 0x0898137f in tTopDriver::Connect (this=0x209f0780) at /home/user/adv/trunk/lib/top.cpp:3314
В итоге:
tTopDriver::Connect (inside the executable)
tTopDriver::APTC_Connect (inside the executable, will call a library's function)
v40TC_m4GLConnect (inside the library)
tTOPClient::m4GLConnect (inside the executable!!!)
Кто-нибудь знает, что может быть причиной такого другого поведения?Makefiles и CMakeLists слишком велики для размещения здесь, но я сравнил их, и они кажутся похожими.Я попытался привести небольшой пример, но не смог воспроизвести проблему.