我正在尝试编译libpqxx代码示例:
#include <iostream>
#include <pqxx/pqxx>
int main(int, char *argv[])
{
pqxx::connection c("dbname=company user=accounting");
pqxx::work txn(c);
pqxx::result r = txn.exec(
"SELECT id "
"FROM Employee "
"WHERE name =" + txn.quote(argv[1]));
if (r.size() != 1)
{
std::cerr
<< "Expected 1 employee with name " << argv[1] << ", "
<< "but found " << r.size() << std::endl;
return 1;
}
int employee_id = r[0][0].as<int>();
std::cout << "Updating employee #" << employee_id << std::endl;
txn.exec(
"UPDATE EMPLOYEE "
"SET salary = salary + 1 "
"WHERE id = " + txn.quote(employee_id));
txn.commit();
}
使用命令:
c++ add_employee.cxx -lpqxx -lpq
不幸的是我有一个错误:
test2.cpp:(.text+0x162): undefined reference to `pqxx::transaction_base::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
test2.cpp:(.text+0x32e): undefined reference to `pqxx::transaction_base::exec(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/cchvWstf.o: In function `pqxx::string_traits<int>::null()':
test2.cpp:(.text._ZN4pqxx13string_traitsIiE4nullEv[_ZN4pqxx13string_traitsIiE4nullEv]+0x47): undefined reference to `pqxx::internal::throw_null_conversion(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/cchvWstf.o: In function `pqxx::connect_direct::connect_direct(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
test2.cpp:(.text._ZN4pqxx14connect_directC2ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN4pqxx14connect_directC5ERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x1f): undefined reference to `pqxx::connectionpolicy::connectionpolicy(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/tmp/cchvWstf.o: In function `pqxx::transaction<(pqxx::isolation_level)0, (pqxx::readwrite_policy)1>::transaction(pqxx::connection_base&)':
test2.cpp:(.text._ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_16readwrite_policyE1EEC1ERNS_15connection_baseE[_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_16readwrite_policyE1EEC1ERNS_15connection_baseE]+0xba): undefined reference to `pqxx::dbtransaction::fullname(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
test2.cpp:(.text._ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_16readwrite_policyE1EEC1ERNS_15connection_baseE[_ZN4pqxx11transactionILNS_15isolation_levelE0ELNS_16readwrite_policyE1EEC1ERNS_15connection_baseE]+0x190): undefined reference to `pqxx::basic_transaction::basic_transaction(pqxx::connection_base&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pqxx::readwrite_policy)'
我该如何编译?我试图改变旗帜的顺序,但它并没有帮助。谢谢。
答案 0 :(得分:1)
请添加姓名 命名空间pqxx 在您的代码中
答案 1 :(得分:0)
首先,检查您的libpxx.so是否正确安装在/ usr / lib中。之后尝试使用g ++ -L / usr / lib / add_employee.cpp -o add_employee -lpqxx -lpq。这应该工作并生成一个名为add_employee的可执行文件(部分-o add_employee)。
答案 2 :(得分:0)
我最近在尝试使用Ubuntu 16.04上的libpqxx-3.1编译代码时遇到过这种情况。相同的代码在Ubuntu 14.04中成功编译,但在Ubuntu 16.04中吐出链接器错误(如你的)。罪魁祸首似乎是gcc 4.8.4和gcc 5.4.0之间libstdc ++的变化。根据&#34;运行时库&#34; https://gcc.gnu.org/gcc-5/changes.html
上的文档图书馆提供双ABI。默认情况下启用新的ABI。仍然支持旧的ABI,可以在包含任何C ++标准库头之前将宏_GLIBCXX_USE_CXX11_ABI定义为0来使用。
要确认这是否是您所面临的问题,请将以下宏添加到cpp文件的顶部并进行编译。
#define _GLIBCXX_USE_CXX11_ABI 0
如果链接成功,那么您已经确认您的代码正在使用std :: string的新实现进行编译(默认情况下gcc5会执行),而您链接到的库使用的是旧的实现(如gcc4所做)。引入宏后,您的代码和libpqxx都使用相同的实现。
长期解决方案是使用使用您正在使用的相同版本的gcc构建的库。我不确定为什么Ubuntu 16.04发布了由较旧的gcc构建的库,它确实让我头疼。您可以坚持使用上述解决方案,编译并安装自己的libpqxx版本,或升级到Linux发行版的更高版本(希望发布更新版本的库)。