2013-07-22 219 views
0

我是新手,在linux上編程,並在終端編譯。我有三個文件:Linux g ++編譯

sql.h

#ifndef SQL_H 
#define SQL_H 

#include "sqlite3.h" 
#include <string> 

class sqlite{ 

private: 
    sqlite3 *db; 
    sqlite3 *statement; 

public: 
    sqlite(const char* filename); 
    void create_table(); 
}; 


#endif 

sql.cpp

#include "sql.h" 
#include <iostream> 

sqlite::sqlite(const char* filename){ 
    if((sqlite3_open_v2(filename, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) == SQLITE_OK) //fájl létrehozása 
     std::cout << "Database has been created successfully!" << std::endl; 

    else{ 
     std::cout << "Oops, something went wrong, please try again!" << std::endl; 
    } 
} 


void sqlite::create_table(/*const std::string &tableName, const std::string &columnNames*/){ 

    //std::string command = "CREATE TABLE " + tableName + culomnNames; 
    sqlite3_prepare_v2(db, "CREATE TABLE a (a INTEGER, b INTEGER)", -1, &statement, NULL); 
    sqlite3_step(statement); 
    sqlite3_finalize(statement); 
    sqlite3_close(db); 

} 

的main.cpp

#include "sql.h" 
#include <string> 
int main(){ 

    sqlite s = sqlite("database.db"); 
    s.create_table(); 
    return 0; 
} 

如果我嘗試用命令g++ -Wall -Werror main.cpp -lsqlite3 -o sqlite_program編譯它,我得到了錯誤:

/tmp/ccKtrrtg.o: In function `main': 
main.cpp:(.text+0x15): undefined reference to `sqlite::sqlite(char const*)' 
main.cpp:(.text+0x21): undefined reference to `sqlite::create_table()' 

這是第一次,我嘗試用自定義標題編譯cpp。也許我應該用不同的命令來做到這一點?

更新:我更新了代碼,它是越野車。 :)現在它的作品!

+0

編譯器並不神奇,你必須告訴它你正在編譯什麼(或者在這種情況下是鏈接)。 – 2013-07-22 21:00:46

+0

[Undefined reference C++]的可能重複(http://stackoverflow.com/questions/6284720/undefined-reference-c) – 2013-07-22 21:02:18

回答

4

你有多個輸入文件,它們都會形成一個二進制文件。

通常的方式(其爲較大的文件的數量很好地擴展)是將每個源文件編譯成二進制對象文件,然後所有的對象文件鏈接到最終的二進制。

g++ -Wall -Werror -o main.o -c main.cpp 
g++ -Wall -Werror -o sql.o -c sql.cpp 
g++    -o sqlite main.o sql.o -lsqlite3 
+0

第二行給我的錯誤: https://www.dropbox.com/s/vqg8he8rcuf1736/show.txt?m – erbal

+0

@erbal包括在sql.cpp – Amadeus

+1

@erbal ,那是因爲你的代碼是越野車;你必須在sql.cpp中包含,'statement'成員的類型應該是'sqlite3_stmt'而不是'sqlite3'等等。 –

4

嘗試運行此

g++ -Wall -Werror main.cpp sql.cpp -lsqlite3 -o sqlite 

這將編譯你的sql.cpp文件,並將其鏈接到可執行文件。

+0

(你所錯過的是輸入文件sql.cpp,它包含了定義) – Sniggerfardimungus

+0

我得到這個錯誤: sql.cpp:在構造函數'sqlite :: sqlite(const char *)'中: sql.cpp:5:3:error:'cout '不是'std'的成員 sql.cpp:5:61:error:'endl'不是'std'的成員 sql.cpp:8:3:錯誤:'cout'不是'std' sql.cpp:8:67:error:'endl'不是'std'的成員 sql.cpp:在成員函數'void sqlite :: create_table()'中: .... – erbal

+0

在你的sql.cpp文件(或頭文件)中,你需要使用'#include ',它具有'std :: cout'和'std :: endl'的定義。 – austin