如何修复由MySql Connector C ++引起的未解析的外部符号?

时间:2010-12-17 11:09:09

标签: c++ mysql

我遵循了本教程http://blog.ulf-wendel.de/?p=215#hello。我在Visual C ++ 2008和Visual C ++ 2010上都尝试过。无论是静态还是动态,编译器都给了我相同的错误消息:

error LNK2001: unresolved external symbol _get_driver_instance

以前是否有人遇到此问题?

更新:
+附加依赖项:mysqlcppconn.lib
+其他包含目录:C:\ Program Files \ MySQL \ MySQL Connector C ++ 1.0.5 \ include
+其他库目录:C:\ Program Files \ MySQL \ MySQL Connector C ++ 1.0.5 \ lib \ opt

另一个更新: 单击链接到:

的get_driver_instance()上的F12
class CPPCONN_PUBLIC_FUNC Driver
{
protected:
    virtual ~Driver() {}
public:
    // Attempts to make a database connection to the given URL.

    virtual Connection * connect(const std::string& hostName, const std::string& userName, const std::string& password) = 0;

    virtual Connection * connect(std::map< std::string, ConnectPropertyVal > & options) = 0;

    virtual int getMajorVersion() = 0;

    virtual int getMinorVersion() = 0;

    virtual int getPatchVersion() = 0;

    virtual const std::string & getName() = 0;
};

} /* namespace sql */

extern "C"
{
  CPPCONN_PUBLIC_FUNC sql::Driver *get_driver_instance();
}

显然,该功能已存在,但链接器无法找到它。

代码段:

#include <iostream>
#include <sstream>
#include <memory>
#include <string>
#include <stdexcept>

using namespace std;

#include "mysql_connection.h"
#include "mysql_driver.h" 

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

int main() {

    try {
        sql::Driver *driver;
        sql::Connection *conn;
        sql::Statement *stmt;
        sql::ResultSet *res;
        driver = get_driver_instance();
        conn = driver->connect( "http://localhost/chandb", "root", "chan" );


        stmt = conn->createStatement();
        res = stmt->executeQuery( "select * from another" );
        while( res->next() ) {
            cout << "id = " << res->getInt( "Id" );
            cout << "id = " << res->getInt( "GoldValue" );
            cout << "id = " << res->getString( "Model" );
        }

        delete conn;
        delete stmt;
        delete res;
        std::cout << "This is it";
    }
    catch( sql::SQLException e ) {
        cout << e.what();
    }
}

谢谢,

8 个答案:

答案 0 :(得分:4)

根据MySQL 5.1 Reference Manual,如果您使用的是MySQL Connector C ++ 1.1版:
“get_driver_instance()现在仅在动态库构建中可用 - 静态构建不可用 有这个符号。这样做是为了适应使用LoadLibrary或dlopen加载DLL。如果不使用CMake构建源代码,则需要定义mysqlcppconn_EXPORTS,如果要动态加载并想使用get_driver_instance()入口点。“
如果我正确理解了上一个注释,则必须使用动态构建并定义mysqlcppconn_EXPORTS

答案 1 :(得分:3)

如果您使用静态链接,则需要在CPPCONN_PUBLIC_FUNC=

中设置Project / Properties / C++ / Preprocessor / Preprocessor Definitions

答案 2 :(得分:2)

使用c ++ / Sql Connector时遇到相同的错误。 花了一整天后,我通过使用32位libmysql.dll,32位libmysqlcppcon.lib和32位libmysqlcppcon.dll解决了这个问题(使用动态绑定,因为驱动程序实例创建仅在libmysqlcppcon.lib的动态库中可用)

我找到了非常好的链接,解释了所有内容和工作代码。如果他们坚持同样的问题,我认为这对其他人有帮助。

http://r3dux.org/2010/11/how-to-use-mysql-connectorc-to-connect-to-a-mysql-database-in-windows/

答案 3 :(得分:1)

  

错误LNK2001:未解析的外部   symbol _get_driver_instance

该错误消息基本上意味着链接器无法在任何地方找到函数get_driver_instance,例如。它不在编译单元的任何目标文件中,也不在静态.lib库或导入库中。如果库中的受损名称与完全与链接器期望找到的名称不匹配,也会发生这种情况。例如。图书馆建立了不同的调用约定等。

我建议您查看项目中使用的最终命令行,并在此处更新您的帖子以进行编译和链接。其次,确保您链接的mysql库具有该功能。我相信在vs中有一个命令行工具用于转储和查看静态库的内容。

如果要链接动态dll版本的mysql,请确保导入库包含缺少的引用符号。此外,您可以使用PE查看器打开dll,并查看其导出表以验证该功能是否实际存在且可见。

编辑:根据this post,函数get_driver_instance应位于某处的“mysqlcppconn.lib”中。您确定该文件已正确链接吗?

答案 4 :(得分:1)

我读了你提到的那篇文章。 它有静态编译的这一行: 如上所述,你需要链接“mysqlcppconn-static.lib”和“libmysql.lib”。

既然你没有提到这是你的问题,你试过这个吗?

另外,在论坛上我读了这篇文章(对于eclips)“你必须在源代码中有这个”:

#include "mysql_driver.h" 
#include "mysql_connection.h"
using namespace sql::mysql; 

无论如何,祝你好运!

答案 5 :(得分:1)

我不知道你是不是已经开始使用这个 MySQL连接器/驱动程序包了但是有许多强大的数据库包装器可以免费或几乎免费提供,如果这导致看似未说出口对你来说很头疼。

当我以前将它们用于数据模型项目时,我确实对QT数据库对象印象深刻。 The QT framework是根据LGPL许可的,并且还提供商业版本,是一组非常通用的跨平台库。 QtSql对象为许多数据库提供了一致的接口,包括MySql,SQLServer,Postgres,ODBC等,能够替换你自己的驱动程序,并且仍然在C ++中的高级别使用相同的接口

其他一些值得注意的选择:

SQLApi++

MySQL++

不要像推销员或其他任何东西那样来,而且我与其中任何一家都没有任何关系,但有时候购物并找到更适合您需求的东西永远不会伤害。

答案 6 :(得分:0)

我在64位操作系统上使用32位版本解决了mysql服务器和connector / c ++问题。 我认为问题是提升库,但我不确定。

答案 7 :(得分:0)

我花了几个小时试图解决与你完全一样的问题。我终于自己发现了这个问题。我下载了64位版本的MySQL / SQL Connector,并按照MySQL.com中的教程设置了win32控制台项目的属性,并得到了如上所述的错误消息。这是因为本教程正在教授构建一个32位程序。在我更改为构建X64代码的发布版本后,问题得以解决。 确保您的库是32位或64位,然后相应地配置Visual Studio(在配置管理器中)。