2014-01-29 29 views
2

我開始對C++和已經走錯了......G ++無法找到的信息,但是我沒有包括他們

我試圖編譯性LevelDB的一個小試驗:

#include <assert.h> 
#include "leveldb/db.h" 

using namespace std; 

int main() { 
    leveldb::DB* db; 
    leveldb::Options options; 
    options.create_if_missing = true; 
    leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db); 
    assert(status.ok()); 

    return 1; 
} 

這裏g ++命令:

g++ -I include/ testLevelDB.cpp 

輸出:

/tmp/ccuBnfE7.o: In function `main': 
testLevelDB.cpp:(.text+0x14): undefined reference to `leveldb::Options::Options()' 
testLevelDB.cpp:(.text+0x57): undefined reference to `leveldb::DB::Open(leveldb::Options const&, std::string const&, leveldb::DB**)' 

包含文件夾是具有levelDB標題的文件夾。

+6

這是鏈接器引發的錯誤,而不是編譯器引發的錯誤。您忘記鏈接您收錄的圖書館。 – arkascha

+0

@arkascha - 你是對的;我已經刪除了我的評論,因爲它是無關緊要的。 – Floris

+1

我假設'leveldb'來自http://code.google.com/p/leveldb/您是否正確下載並安裝'leveldb'?您可能需要在鏈接器命令中提供庫的路徑。對於這個問題 - 您可能需要先建立圖書館,具體取決於您下載的方式。 – Floris

回答

6

你需要告訴鏈接鏈接到leveldb庫如

g++ -I include/ testLevelDB.cpp -lleveldb 

但是如果庫不在/usr/lib/usr/local/lib該案例假設libleveldb.so中存在,這將不起作用一些所謂的路徑$LEVELDB_PATH你需要做的

g++ -I include -L $LEVELDB_PATH testLevelDB.cpp -lleveldb 

-L很像-I但它告訴鏈接器在哪兒查找庫。

此外,由於您似乎是gcc世界的新手,請查看this gcc intro文檔。

+0

我得到: /usr/bin/ld:找不到-lleveldb – Simon

+0

那是因爲庫不在/ usr/lib或/ usr/local/lib中,因此更新了相應的答案。 – ismail

+0

您可能還需要一個-L來指定找到leveldb庫的路徑。儘管如此,在設定目標的地方,仍然存在鏈接階段。上面看起來像一個編譯命令。 – CashCow

1

這是一個鏈接錯誤。與標題無關。你有鏈接這個庫(-l ..)?

+0

胡,沒有。我如何鏈接它?我指定頭文件夾? – Simon

+0

取決於什麼「leveldb」是..它是一個庫(以.so結尾) - 使用-l ..或者如果它是一個cpp文件或.a文件 - 只需將它們添加到gcc輸入 – GabiMe

相關問題