2015-04-02 55 views
0

我想編譯odb附帶的「Hello World」示例。我正在使用debian Linux。odb「Hello World」鏈接產生「未定義的參考」

我複製了person.hxx和driver.cxx文件

// person.hxx 
#ifndef person_hxx 
#define person_hxx 

#include <string> 
#include <odb/core.hxx> 

#pragma db object 
class person 
{ 
public: 
    person (const std::string& first, 
      const std::string& last, 
      unsigned short age); 

    const std::string& first() const; 
    const std::string& last() const; 

    unsigned short age() const; 
    void age (unsigned short); 

private: 
    person() {} 

    friend class odb::access; 

    #pragma db id auto 
    unsigned long id_; 

    std::string first_; 
    std::string last_; 
    unsigned short age_; 
}; 

#endif 


// driver.cxx 

#include <memory> 
#include <iostream> 

#include <odb/database.hxx> 
#include <odb/transaction.hxx> 

#include <odb/mysql/database.hxx> 

#include "person.hxx" 
#include "person-odb.hxx" 

using namespace std; 
using namespace odb::core; 

int main (int argc, char * argv[]) 
{ 
    try 
    { 
     auto_ptr<database> db (new odb::mysql::database (argc, argv)); 

     unsigned long john_id,jane_id, joe_id; 
     { 
     person john("John","Doe", 33); 
    person jane ("Jane","Doe", 32); 
     person joe("Joe","Dirt",30); 

    transaction t (db -> begin()); 

     john_id = db->persist(john); 
     jane_id = db->persist(jane); 
     joe_id = db->persist(joe); 

     t.commit(); 
     } 
    } 
    catch (const odb::exception& e) 
    { 
     cerr << e.what() <<endl; 
     return 1; 
    } 
} 

driverthe ODB編譯器工作正常並製作人,ODB文件。

我編譯他們

g++ -c deiver.cxx 
g++ -c person-odb.cxx 

和一切順利。

的問題開始與鏈接階段

g++ driver.o person-odb.o -lodb-mysql -lodb -o driver 

這reulted在

driver.cxx:(.text+0x14d): undefined reference to `person::person(std::string const&, std::string const&, unsigned short)' 
+3

你要麼不編譯也要鏈接'person.cpp',或者你不要定義構造函數person :: person'。鏈接器無法找到構造函數的目標代碼。 – vsoftco 2015-04-02 18:49:23

+0

其中是person-odb.cxx?顯示給我們。該鏈接器抱怨說它不包含構造函數的代碼 – pm100 2015-04-02 18:52:58

+0

該示例沒有person.cpp文件,只有一個名爲「person-odb.cpp」的文件,由odb編譯器 – 2015-04-02 18:53:12

回答

0

你需要添加實施構造。示例:

person (const std::string& first, 
     const std::string& last, 
     unsigned short age){} 
0

幾年後,如果您複製並粘貼odb網站中提供的分步示例,仍然會遇到問題。 person.hxx文件中缺少該實現。

替換以下:

person (const std::string& first, 
      const std::string& last, 
      unsigned short age); 

與此:

person (const std::string& first, 
      const std::string& last, 
      unsigned short age) : 
     first_(first), 
     last_(last), 
     age_(age) 
    { 
    } 

此外,在driver.cxx您可以unique_ptr更換auto_ptr或編譯這樣:

g++ -g -std=c++98 -o driver driver.cxx person-odb.cxx -lodb-mysql -lodb 

你可以下載工作示例:https://www.codesynthesis.com/products/odb/download.xhtml