2


ここに私の問題があります。Firebreath で Web ブラウザ プラグインを作成しています。クライアントの要求に応じて、プラグインは異なるデータベース (Firebird、MS SQL、My SQL など) に接続する必要があります。そこで、正しいDBへの接続を管理するクラスを作成しています。Firebird に接続するには、IBPP を使用しようとしています。簡単なテスト プロジェクトで IBPP を使用して FB に接続できました。しかし今、もっと複雑なことをしているときに、この奇妙なリンカ エラー 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 &)
" (?DatabaseFactory@IBPP@@YA?AV?$Ptr@VIDatabase@IBPP@@@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@000000@Z)
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 &)"
(?DatabaseFactory@IBPP@@YA?AV?$Ptr@VIDatabase@IBPP@@@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@000@Z)
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;
    }
}



私は2日間グーグルしていますが、何が問題なのかまだわかりません。LNK2019 エラーの意味は理解できますが、この場合に発生する理由がわかりません。
このエラーを生成する行は次のとおりです。

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

誰が何が悪いのか教えてもらえますか?
ああ、私は Visual Studio 2012 Express を使用しています。

4

1 に答える 1

0

namespace接続で定義を提供していないソースのメソッドにアクセスしようとしています。

この方法 :

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

接続で定義を提供しますnamespace

using namespace connections;ソースファイルに書き込みます。

于 2013-07-24T13:37:29.033 に答える