无法编译简单的 ODBC++ 测试程序:undefined reference

Unable to compile a simple ODBC++ test program: undefined reference

我正在尝试构建一个非常简单的 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 的一个区别,我假设它是字符串的类型定义,但到目前为止我还无法确认这一点。

有没有人对如何解决这个问题有任何提示?

更新:

来自 libodbc++-mt.so 的 Demangled 符号:

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&)

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

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

其次,将 libstlport.so 链接到我的测试程序,之后,它开始显示其他很容易克服的编译器错误。

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

坏消息: 我无法观察到我希望看到的内存泄漏:)