2015-11-02 59 views
2

在過去使用libpq-fe.h之後,對於新項目我開始使用pqxx。如何用代碼塊下的pqxx解決編譯錯誤

所以,在我的代碼包括:

#include <pqxx/pqxx> 

我編譯。一切都很好。
當我宣佈:

pqxx::connection p_con; 

我編譯,我有錯誤:

obj/Debug/src/dbfunc.o: In function `pqxx::connect_direct::connect_direct(std::string const&)': 
/usr/include/pqxx/connection.hxx:87: undefined reference to `pqxx::connectionpolicy::connectionpolicy(std::string const&)' 
/usr/include/pqxx/connection.hxx:87: undefined reference to `vtable for pqxx::connect_direct' 
obj/Debug/src/dbfunc.o: In function `pqxx::connect_direct::~connect_direct()': 
/usr/include/pqxx/connection.hxx:84: undefined reference to `vtable for pqxx::connect_direct' 
/usr/include/pqxx/connection.hxx:84: undefined reference to `pqxx::connectionpolicy::~connectionpolicy()' 
obj/Debug/src/dbfunc.o: In function `pqxx::basic_connection<pqxx::connect_direct>::basic_connection()': 
/usr/include/pqxx/basic_connection.hxx:61: undefined reference to `pqxx::connection_base::connection_base(pqxx::connectionpolicy&)' 
/usr/include/pqxx/basic_connection.hxx:62: undefined reference to `pqxx::connection_base::init()' 
obj/Debug/src/dbfunc.o: In function `pqxx::basic_connection<pqxx::connect_direct>::~basic_connection()': 
/usr/include/pqxx/basic_connection.hxx:78: undefined reference to `pqxx::connection_base::close()' 

搜索谷歌表示這是不是圖書館的問題。
逸岸:一個非常類似的問題,同樣的錯誤,在這裏已經解決:Problem compiling program with pqxx

我不明白怎麼解決它的代碼::塊。任何建議?

軟件版本:

  • 代碼:: Blocks的13.12
  • O的:Debian的8.2
  • Libpqxx:libpqxx-4.0
  • 編譯器用於:gcc的
  • 的gcc --version:GCC (Debian 4.9.2-10)4.9.2

我是相對的ne w至使用代碼::塊,所以也許我失去了一些東西: -/

編輯:由於要求2路:

  • /usr/lib目錄/ x86_64的-Linux的GNU/libpq.so
  • /usr/lib目錄/ x86_64的-Linux的GNU/libpq.a
+0

你與'-lpq'正確編譯? – Azad

+0

不,我沒有」 t。我在項目 - >編譯選項 - >編譯器設置 - >其他選項中添加了它但是沒有任何變化,那麼命令改變了:「g ++ -std = C++ 11 -Wall -fexceptions -g -lpq -Iinclude -c/myfil e.cpp -o /myfile.o「 –

+0

首先嚐試Mike Kinghan的建議,如果在你的系統上搜索一個名爲'libpq.so'或'libpq.a'的文件失敗並且發佈它的路徑 – Azad

回答

2

-lpq,像所有-l<libname>選項,是一個連接選項,而不是 的編譯器選項。通過將其在編譯器設置 - >其他選項 你說你已經產生了編譯命令行:

g++ -std=c++11 -Wall -fexceptions -g -lpq -Iinclude -c /myfile.cpp -o /myfile.o 

由於這只是一個編譯命令沒有鏈接參與和-lpq被忽略, 而在您的鏈接命令行 - 你沒有向我們顯示 - 沒有-lpq選項 會出現。

採取-lpq編譯器設置 - >其他選項,把-lpqxx-lpq連接器設置 - >其他選項。然後-lpqxx -lpq將傳遞給 鏈接器,因爲他們需要。

如果連接器抱怨說-lpqxx沒有找到,那麼你需要安裝 libpqxx

+0

按照您的指示進行修改,但仍然存在錯誤。 –

+0

@ user_0仍然錯過了正確的庫!查看更新。 –

+0

嗯,我需要承認,我有點生疏,多年後,回到C++。感謝您的糾正。現在一切都很好。非常感謝你。 –

0

您是否嘗試過這種做法?

嘗試宣告一個獨特的指針連接:

std::unique_ptr<pqxx::connection> connection;

那麼您可以在將它傳遞給一個函數,如:

bool do_something(std::unique_ptr<pqxx::connection> & connection) { 

    connection.reset(new pqxx::connection("myconnectionstring")); 

    std::string sqlstr ="select * from some table;"; 

    pqxx::result r; 
    try { 
     pqxx::work query(*connection, ""); 
     r = query.exec(sqlstr, "cache batch types"); 

    } catch (const std::exception & e) { 
     return false; 
    } 

    // handle results... 

    return true; 
} 
+0

仍然得到:/usr/include/pqxx/connection.hxx|84|未定義的引用'vtable for pqxx :: connect_direct'| AND /usr/include/pqxx/connection.hxx|84|未定義對'pqxx :: connectionpolicy ::〜connectionpolicy()'的引用| –

0

我有OP從VIM到代碼:: Blocks的切換時所描述的完全相同的錯誤。

我通過把「pqxx」下的「設置/編譯器和調試器設置」選項卡‘連接器設置’,在左側窗格(‘鏈接庫’)解決了這個問題。

在那之後,我的計劃(使用pqxx LIB)沒有錯誤編譯。

我使用的代碼:: Blocks的10.05對Linux Mint的13瑪雅。