无法编译简单的ODBC ++测试程序:未定义的引用

时间:2018-03-31 22:29:38

标签: compiler-errors g++ unixodbc

我正在尝试构建一个非常简单的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&)

1 个答案:

答案 0 :(得分:0)

通过Mike Kinghan的关键提示,我能够编译测试。

首先,我发现我的libodbc++没有使用std::string,而是stlp_std::string(属于STLPort)。

其次,将libstlport.so与我的测试程序相关联,之后,它开始显示其他编译器错误,这些错误很容易克服。

最后,在调整代码后,我能够编译并运行测试。

糟糕的新人:我无法观察到我希望看到的内存泄漏:)