2011-04-20 101 views
1

我想要得到一個基本的「hello world」sqlite3程序進入cygwin。我最初從setup.exe安裝它,但是當我運行程序時,出現鏈接器錯誤,例如「對_sqlite3_open'的未定義引用」。 I編譯時使用-lsqlite3開關。cygwin SQLite3導致鏈接器錯誤

的位置是在這裏:

$ ls /usr/lib/ | grep sql 
libsqlite3.a 
libsqlite3.dll.a 
libsqlite3.la 

然後我試圖下載sqlite3的源和手動編譯它,但我得到了同樣的錯誤。它安裝到/ usr/local/lib目錄

$ ls /usr/local/lib/ | grep sql 
libsqlite3.a 
libsqlite3.dll.a 
libsqlite3.la 

我還是讓這些鏈接器錯誤,雖然,我似乎無法弄清楚如何解決它?

$ gcc -lsqlite3 test.cc 
test.cc: In function ‘int main()’: 
test.cc:41: warning: deprecated conversion from string constant to ‘char*’ 
/tmp/ccKA3ZFa.o:test.cc:(.text+0x2d): undefined reference to `_sqlite3_open' 
/tmp/ccKA3ZFa.o:test.cc:(.text+0x41): undefined reference to `_sqlite3_errmsg' 
/tmp/ccKA3ZFa.o:test.cc:(.text+0xb6): undefined reference to `_sqlite3_prepare_v2' 
/tmp/ccKA3ZFa.o:test.cc:(.text+0xca): undefined reference to `_sqlite3_errmsg' 
/tmp/ccKA3ZFa.o:test.cc:(.text+0x10e): undefined reference to `_sqlite3_step' 
/tmp/ccKA3ZFa.o:test.cc:(.text+0x12a): undefined reference to `_sqlite3_column_bytes' 
/tmp/ccKA3ZFa.o:test.cc:(.text+0x140): undefined reference to `_sqlite3_column_text' 
/tmp/ccKA3ZFa.o:test.cc:(.eh_frame+0x11): undefined reference to `___gxx_personality_v0' 
collect2: ld returned 1 exit status 

感謝您的幫助,您可以提供。乾杯:)

回答

3

這是-l選項,這是造成你的問題的放置。嘗試而不是執行此:

gcc test.cc -lsqlite3 

按照以下成績單:

pax$ cat qq.c 
#include <sqlite3.h> 
int main (void) { 
     sqlite3 *x; 
     sqlite3_open("db", &x); 
     return 0; 
} 

pax$ gcc -L/usr/lib -lsqlite3 -o qq qq.c 
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccmgVbDt.o: 
    qq.c:(.text+0x25): undefined reference to `_sqlite3_open' 
collect2: ld returned 1 exit status 

pax$ gcc -L/usr/lib -o qq qq.c -lsqlite3 

pax$ _ 

你可以看到,當-l如下其他參數,也沒有連接錯誤。

從該名男子頁的相關位(下-l說明):

這使得其中的命令寫這個選項的差異;鏈接器將按照它們指定的順序搜索和處理庫和對象文件。因此,foo.o -lz bar.o在文件foo.o之後但在bar.o之前搜索庫z。如果bar.o引用z中的功能,則可能不會加載這些功能。

換句話說,在您指定點,還有那麼他們沒有被加載任何的SQLite的功能沒有尚未解決的引用。

後來,當您加載test.o時,它確實有有未解析的引用。不幸的是,既然您已經查看了SQLite3庫並對其進行了折扣,它們將永遠不會被解決。因此你的錯誤。

+0

Derp,它似乎是放置。也許這是一個cygwin的東西?我似乎沒有記得之前有一個安置問題:)謝謝!我試圖弄清楚爲什麼它沒有連接哈哈。 (是的,你是對的,這是一個C++程序,只是一個錯字) – Jordan 2011-04-20 02:33:05

+0

@Jordan,我不認爲它只限於CygWin。完全相同的文本出現在我的Ubuntu 10.04盒子的手冊頁中。我想這可能是因爲它是CygWin下的gcc3,但是Ubuntu中的gcc3也是gcc4。我在_many_系統上曾經遇到過這個問題_many_次,所以我認爲這很常見。我們甚至曾經引入了一個kludge來修改庫列表以擺脫這個問題 - 它包括複製列表的次數與列表中的單個庫相同:所以'-la'或'-la -lb -la - Ib'或'-la -lb -lc -la -lb -lc -la -lb -lc'等等。 – paxdiablo 2011-04-20 02:38:55

1

你可能需要您的圖書館在命令的末尾:

gcc test.cc -lsqlite3 

鏈接器通常搜索從左至右和SQLite的符號在test.cc被引用,但在libsqlite3.a定義的符號。