2013-04-18 68 views
1

這是我第一次嘗試製作一個簡單的庫。我使用g ++ 4.6.3在Ubuntu 12.04中工作。這裏的問題是:我自己的C++庫鏈接錯誤

[[mylib.cpp]] 
#include<sqlite3.h> 
void Mylib::blahblah() {...} 
void Mylib::evenmoreblah() {...} 
... 

[[mylib.h]] 
#include <...> 
class Mylib { 
    ... 
}; 

然後,我通過由的lib:

gcc -c -Wall -fpic mylib.cpp 
gcc -shared -o libmylib.so mylib.o 

我使用的庫,其中僅包含main()的一個單一的TEST.CPP。我在./libdir把libmylib.so,並通過編譯:

g++ -g test.cpp -o test -lpthread -L/usr/local/lib -lsqlite3 -L./libdir -lmylib 

我得到的錯誤:

./libdir/libmylib.so: undefined reference to `sqlite3_close' 
./libdir/libmylib.so: undefined reference to `sqlite3_exec' 
./libdir/libmylib.so: undefined reference to `sqlite3_free' 
./libdir/libmylib.so: undefined reference to `sqlite3_open' 

回答

2

您可以鏈接到共享庫與

gcc -shared mylib.o -o libmylib.so -lsqlite3 

如果你這樣做,你並不需要顯式鏈接到您的程序,但不會傷害。

和連接參數爲你的程序的順序很重要:

g++ -Wall -g test.cpp -o mytest \ 
    -L./libdir -lmylib -L/usr/local/lib -lsqlite3 -lpthread 

應該從更高級別的圖書館去到較低的水平(即系統)的。不要忘記-Wall幾乎可以從編譯器獲得所有警告,這非常有用。

閱讀Program Library HowTo

PS。不要打電話給你的程序test這是一個shell內置(和標準/usr/bin/test)。使用一些其他的名字。

+0

感謝您的輸入。你的答案和zakinster一樣正確。但我會接受他,因爲他比你早一點回答。附:在我的例子中所有的名字都是假的,但是謝謝你指出測試是shell內置的。 – GuLearn

+0

你可以upvote我的回覆.... –

+0

謝謝你指出,我編譯庫時可以鏈接sqlite3! – GuLearn

2

如果庫做出引用SQLITE3,您應該將您的圖書館後鏈接源碼:

g++ -g test.cpp -o test -lpthread -L/usr/local/lib -L./libdir -lmylib -lsqlite3 

否則ld不會將您的庫之前找到任何在libsqlite3有用的,將無法找到後所請求的符號。

+0

非常感謝! – GuLearn

0

由於您的圖書館使用sqlite3,因此您需要在鏈接器命令中添加自己的庫後。我想你可以將它添加到你的共享庫的鏈接中,但不能確定。

鏈接器按列出它們的順序解析庫及其引用,所以順序很重要。