Библиотека вызывает функцию внутри исполняемого файла, а не внутри библиотеки. - PullRequest
2 голосов
/ 30 декабря 2011

Проблема, с которой я столкнулся, немного сложна для объяснения, но я постараюсь изложить ее проще (у меня больше нет идей о том, как ее решить).

Ну, в общем, мыУ меня очень большой проект 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 слишком велики для размещения здесь, но я сравнил их, и они кажутся похожими.Я попытался привести небольшой пример, но не смог воспроизвести проблему.

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

И cmake, и make не имеют прямого влияния на сгенерированные исполняемые файлы, а только вызывают компилятор.Результат компилятора полностью определяется его входными параметрами, поэтому, если cmake и make выводят одинаковые вызовы компилятора, результирующий исполняемый файл должен показать то же поведение.

Вкратце: сравните вывод make и cmake (вам, вероятно, придется присвоить cmake некоторые флаги, чтобы он отображал реальные вызовы вместо используемых по умолчанию бесполезных индикаторов прогресса), и посмотрите (grep, sort, diff), гдевызовы компилятора отличаются.

1 голос
/ 31 декабря 2011

Я также подозреваю, что различные флаги передаются компилятору или компоновщику.Я бы скомпилировал все, затем коснулся только одного файла cpp и скомпилировал сборку cmake следующим образом:

VERBOSE = 1 make -j1> log-cmake.txt

VERBOSE = 1 приводит к makeпоказывая параметры, которые передаются в GCC.Затем скомпилируйте с вашим старым make-файлом

make -f Makefile.old> log-oldmakefile.txt

Когда вы найдете флаги, которые отличаются между двумя вызовами компилятора / компоновщика, посмотрите на эти переменные cmake:

  • CMAKE_CXX_FLAGS
  • CMAKE_CXX_FLAGS_RELEASE
  • CMAKE_SHARED_LINKER_FLAGS

* информация о значении переменных 1020 в

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...