2010-11-21 91 views
3

我有兩個項目,一個是使用libpq頭文件和可執行文件的庫,它鏈接到我的庫和libpq,但不管我如何放入makefile,它只是不鏈接libpq和aways返回給我一個未定義的引用錯誤。它鏈接我的lib好吧。未定義的libpq函數參考

g++ -o MYAPP main.o -L../Libs -lpq -lMYLIB 

libpq.a和libmylib.a都在Libs目錄中。
我用nm來檢查函數,他們在那裏,我改變了-lpq到-lpq_並且編譯器抱怨缺少的lib,所以它找到並且理論上是鏈接,但是找不到引用?

這真的讓我感到困擾,它會是什麼?

(我的英文不是很好,抱歉)

感謝,
喬納森

回答

3

我趕緊查了一些postgre頭我都飛來飛去的,他們似乎在extern "C"時候不要將自己包裹起來用C++編譯器編譯。通過在extern "C" { ... }塊中包含postgre的頭文件包含語句可以解決您的問題嗎?

編輯。 我認爲問題是這樣的:libpq.a and libmylib.a。起初,我在原來的帖子中忽略了這一點,對於噪音感到抱歉。當您將-lpq設置爲gcc時,它會嘗試進行動態鏈接。 除非你給一個庫目錄-L 那裏只存在靜態版本的庫。靜態庫不能記錄他們需要插入哪些其他庫。另外,對於靜態庫,規格順序非常重要。依賴於其他庫的庫需要在它們之前列出。通過apt-get安裝,您可以安裝共享庫,以正確記錄他們需要鏈接的其他東西(檢查ldd /usr/lib/libpq.so)。因此,在您之前的嘗試中,您可能只需要將-lpq-lMYLIB相反並列出libpq需要的其他庫。

+0

我添加了extern「C」{#include「libpq-fe.h」}並且沒有工作 – Jonathan 2010-11-21 00:41:47

+0

AFAIK,鏈接順序與動態庫無關,但如果你還沒有嘗試過,你可以反向'-lpq'和'-lMYLIB'。 – dennycrane 2010-11-21 00:52:39

+0

我這樣做了,然後它給了我更多未經驗證的錯誤,但對於libpq中的其他東西,比如kerberus,這讓我感到困惑。但現在它正在工作......我所做的就是刪除我創建的用於鏈接目的的Libs目錄,然後通過apt-get安裝libpq,並讓g ++鏈接到這個新的lib,然後它不會再給我錯誤。我猜它也與其他圖書館有聯繫?這對我來說是有點新聞。如果有人解釋...... – Jonathan 2010-11-21 01:01:05