我正在尝试构建一个非常简单的libodbc++
程序。最近,我们注意到一个奇怪的内存泄漏,我们认为它源于ODBC ++和IDS驱动程序之间 - 我正在编写一个旨在证明这一点的测试。
我使用以下命令编译测试:
g++ -m32 -fPIC -Wall -g \
-I<PATH_TO_LIB_REPO>/odbc++/0_2_3/include \
-I<PATH_TO_LIB_REPO>/IBM/IDS/CSDK/lnx/4.10.UC9W1post/CSDK/incl/cli \
-I<PATH_TO_LIB_REPO>/IBM/IDS/CSDK/lnx/4.10.UC9W1post/CSDK/incl/esql \
-L/LIBS \
-l"odbc++-mt" \
demo.cpp
demo.cpp
相当简单:
#include <iostream>
#include <odbc++/drivermanager.h>
#include <odbc++/connection.h>
// ... other includes go here
using namespace std;
int main(int argc, char** argv){
string dsn = "DSN=mydb;;uid=username;RECVTIMEOUT=900;pwd=password";
odbc::Connection* conn = odbc::DriverManager::getConnection(dsn.c_str());
return 0;
}
但是,我一直在接受:
/tmp/cc8MhaKk.o: In function `main':
demo.cpp:34: undefined reference to `odbc::DriverManager::getConnection(std::string const&)'
collect2: error: ld returned 1 exit status
请忽略行号(34),因为上面的例子中删除了一些额外的部分。
我无法深究它。请注意我正在链接libodbc ++ - mt - 我尝试列出该.so文件中的符号,当然,对DriverManager::getConnection
的调用就在那里。
我注意到libodbc ++使用ODBCXX_STRING
的一个区别,我将其视为字符串中的typedef,但到目前为止我还没有确认。
有没有人对如何解决这个问题有任何暗示?
libodbc++-mt.so
的解码符号:
libodbc++-mt.so:00016c60 T _ZN4odbc13DriverManager13getConnectionERKN8stlp_std12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE
odbc::DriverManager::getConnection(stlp_std::basic_string<char, stlp_std::char_traits<char>, stlp_std::allocator<char> > const&)
libodbc++-mt.so:00016cd0 T _ZN4odbc13DriverManager13getConnectionERKN8stlp_std12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9_S9_
odbc::DriverManager::getConnection(stlp_std::basic_string<char, stlp_std::char_traits<char>, stlp_std::allocator<char> > const&, stlp_std::basic_string<char, stlp_std::char_traits<char>, stlp_std::allocator<char> > const&, stlp_std::basic_string<char, stlp_std::char_traits<char>, stlp_std::allocator<char> > const&)
答案 0 :(得分:0)
通过Mike Kinghan的关键提示,我能够编译测试。
首先,我发现我的libodbc++
没有使用std::string
,而是stlp_std::string
(属于STLPort
)。
其次,将libstlport.so
与我的测试程序相关联,之后,它开始显示其他编译器错误,这些错误很容易克服。
最后,在调整代码后,我能够编译并运行测试。
糟糕的新人:我无法观察到我希望看到的内存泄漏:)