2017-02-07 5 views
1

나는 libpqxx 코드 예제를 컴파일하려고 :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(); 
} 

사용하여 명령을

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

내가 그것을 어떻게 컴파일 할 수

c++ add_employee.cxx -lpqxx -lpq 

불행하게도 나는 오류를 가지고있다? 플래그 순서를 변경하려고했지만 도움이되지 않습니다. 고맙습니다.

답변

0

먼저 libpxx.so가/usr/lib에 제대로 설치되어 있는지 확인하십시오. 그 후에 g ++ -L/usr/lib/add_employee.cpp -o add_employee -lpqxx -lpq를 사용해보십시오. 이렇게하면 add_employee (실행 파일 -o add_employee)라는 실행 파일을 생성하고 생성해야합니다.

0

우분투 16.04에서 libpqxx-3.1로 코드를 컴파일하려고 할 때 최근에이 문제가 발생했습니다. 동일한 코드가 우분투 14.04에서 성공적으로 컴파일되었지만 우분투 16.04에서 링커 오류 (귀하의 것과 같은)를 뱉어 냈습니다. 범인은 libstdC++에서 gcc 4.8.4와 gcc 5.4.0 사이의 변화로 보입니다. 이것은 당신이 직면하고있는 문제가 있는지 여부를 확인하려면 https://gcc.gnu.org/gcc-5/changes.html

A Dual ABI is provided by the library. A new ABI is enabled by default. The old ABI is still supported and can be used by defining the macro _GLIBCXX_USE_CXX11_ABI to 0 before including any C++ standard library headers.

에서 "런타임 라이브러리"문서 당, 당신의 CPP 파일의 맨 위에 다음 매크로를 추가하고 컴파일합니다. 당신이 연결하고있는 라이브러리가 사용하면서

#define _GLIBCXX_USE_CXX11_ABI 0

성공적으로 연결되면

는, 당신은 당신의 코드가 표준 : : 문자열 (기본적으로 할 것 gcc5 등)의 새로운 구현을 컴파일하는 것을 확인했습니다 오래된 구현 (gcc4가하는 것처럼). 소개 된 매크로를 사용하면 코드와 libpqxx가 동일한 구현을 사용하고 있습니다.

장기적인 해결책은 사용중인 gcc와 동일한 버전의 라이브러리를 사용하는 것입니다. 왜 우분투 16.04 라이브러리가 오래된 gcc로 만들어 졌는지 모르겠습니다. 확실히 두통을 불러 일으 킵니다. 위의 해결책을 고수하거나, libpqxx의 자체 빌드를 컴파일 및 설치하거나, ​​최신 버전의 Linux 배포판으로 업그레이드 할 수 있습니다.