无法编译简单的 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
链接到我的测试程序,之后,它开始显示其他很容易克服的编译器错误。
最后,在调整代码后,我能够编译并运行测试。
坏消息: 我无法观察到我希望看到的内存泄漏:)
我正在尝试构建一个非常简单的 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
链接到我的测试程序,之后,它开始显示其他很容易克服的编译器错误。
最后,在调整代码后,我能够编译并运行测试。
坏消息: 我无法观察到我希望看到的内存泄漏:)