2013-07-24 35 views
2


所以这是我的问题。我正在Firebreath编写Web浏览器插件。取决于客户端请求,插件必须连接到不同的数据库(Firebird,MS SQL,My SQL等)。所以我创建类来管理连接到正确的数据库。要连接到Firebird,我试图使用IBPP。我设法在简单的测试项目中使用IBPP连接到FB。但是现在当我做更复杂的事情时,我得到了这个奇怪的链接器错误LNK2019。

确切的错误信息是:在Firebreath项目中使用IBPP时出现LNK2019错误

Error 2 error LNK2019: unresolved external symbol "class IBPP::Ptr<class IBPP::IDatabase> 
__cdecl IBPP::DatabaseFactory(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &) 
" ([email protected]@@[email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 
referenced in function "class IBPP::Ptr<class IBPP::IDatabase> 
__cdecl IBPP::DatabaseFactory(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > 
const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" 
([email protected]@@[email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) 
C:\ff-extensions\F4U\build\projects\F4UConv\Connections.obj F4UConv 



代码为我的连接看起来是这样的:

#ifndef Connections_h 
#define Connections_h 

#include <cstdarg> 
#include <string> 

#include "ibpp\ibpp.h" 
#include "..\Logger\Logger.h" 

using namespace std; 

namespace Connections{ 

    class Connection { 
     public: 
      void set_logger(Logger::Logger *logger); 

      virtual bool setup_connection(string machine, string db_path, string login, string passwd)=0; 
      virtual bool connect()=0; 
      virtual bool disconnect()=0; 

      virtual bool setup_statement(string sql_statement, const char *fmt, ...)=0; 

      template <class Statement> 
      Statement execute_statement(); 

     protected: 
      string machine; 
      string db_path; 
      string login; 
      string passwd; 
      Logger::Logger *logger; 

    }; 

    class FB_Connection : public Connection { 
     public: 
      ~FB_Connection(); 

      bool setup_connection(string machine, string db_path, string login, string passwd); 
      bool connect(); 
      bool disconnect(); 

      bool setup_statement(string sql_statement, const char *fmt, ...); 

      template <class Statement> 
      Statement execute_statement(); 

     private: 
      IBPP::Database db; 
    }; 
}; 

#endif Connections_h 



#include "Connections.h" 

namespace Connections{ 

    void Connection::set_logger(Logger::Logger *logger){ 
     this->logger = logger; 
    } 

    FB_Connection::~FB_Connection(){ 
     if(this->db->Connected()){ 
      this->disconnect(); 
     } 
     db->Drop(); 
    } 

    bool FB_Connection::setup_connection(string machine, string db_path, string login, string passwd){ 
     this->machine = machine; 
     this->db_path = db_path; 
     this->login = login; 
     this->passwd = passwd; 

     try{ 
      this->db = IBPP::DatabaseFactory(this->machine, this->db_path, this->login, this->passwd); 

      this->db->Create(3); 
     }catch(IBPP::Exception& e){ 
      if(logger != nullptr){ 
       this->logger->log(Logger::LogMsgValue[Logger::E_LOGMSG_000002]); 
       this->logger->log(Logger::LEVEL_ERROR, e.ErrorMessage()); 
      } 
      return false; 
     } 

     return true; 
    } 

    bool FB_Connection::connect(){ 
     return true; 
    } 

    bool FB_Connection::disconnect(){ 
     return true; 
    } 

    bool FB_Connection::setup_statement(string sql_statement, const char *fmt, ...){ 
     return true; 
    } 

    template <class Statement> 
    Statement FB_Connection::execute_statement(){ 
     return this; 
    } 
} 



我google搜索了两天,仍然不知道有什么问题。我明白LNK2019错误的含义,但不知道为什么会出现这种情况。
生成此错误的行是:

this->db = IBPP::DatabaseFactory(this->machine, this->db_path, this->login, this->passwd); 

谁能告诉我有什么不对?
哦,我正在使用Visual Studio 2012 Express。

回答

0

您试图访问该方法在你还没有在连接namespace提供的定义来源,即

这种方法:

DatabaseFactory(this->machine, this->db_path, this->login, this->passwd); 

在提供一个定义它连接namespace

在源文件中写入using namespace connections;

+0

并非如此。 DatabaseFactory是ibpp.h库中名称空间IBPP中定义的一种方法。 –

+0

然后,您应该在源文件中包含ibpp.h。为什么包含两个名称空间定义......一个在你的头文件中,另一个在你的源文件中? – 0decimal0

+0

它包含在头文件Connections.h中,所以它也在源文件中Connections.cpp –

相关问题