繁体   English   中英

MySQL连接器问题-链接甚至更多

MySQL Connector Issues - Linking and even more

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

所以,我又来了。 经过一整天的尝试来找到链接libmysql.lib和mysqlclient.lib的解决方案之后,我已经彻底完成。 因此,在那里,我决定采用另一种方法并使用方便的MySQL连接器。

由于它的1.1.0版本使用了boost,而我没有提供boost,也不想花时间去了解所有内容,因此我决定下载1.0.5。

因此,我安装了它,创建了新项目,链接了所有必要的库,设置了其他库并包含了(好吧,通常,按照手册进行所有操作。要测试它是否正常工作,我使用了以下示例:

#include <stdlib.h>
#include <iostream>

#include "driver.h"
#include "exception.h"
#include "resultset.h"
#include "statement.h"
#include "prepared_statement.h"

int main(){

    sql::Driver *driver;
    sql::Connection *con;
    sql::Statement *stmt;
    sql::ResultSet *res;
    sql::PreparedStatement *pstmt;

    try{
        driver = get_driver_instance();
        con = driver->connect("localhost", "root", "root");
        con->setSchema("test");

        /*blah blah yada yada*/

        }catch(sql::SQLException &e){
            std::cout<<e.what();
        }
}

我跳过了部分代码,因为这不是重点。 因此,问题在于应用程序错误,提示无法正确启动(0xc000007b)。 调试并没有太大帮助,因为该错误会在程序运行后立即发生,即即使我将无限循环放在最开始,它仍然会崩溃。

因此,我想到:“这应该是该版本的一些错误,因此我必须尝试较新的版本”。 之后,我继续下载了1.1.0版的连接器以及boost库。 比创建新项目,像第一个一样设置所有依赖项,但是指向连接器的较新版本。 除此之外,我还设置了新的参考mysqlcppconn_EXPORTS。 因此,准备工作已经完成,出于测试目的,我使用了MySQL网站中的代码,通常,类似这样:

/*tons of includes here*/

int main(int argc, const char *argv[]) {

    Driver *driver;
    Connection *con;
    Statement *stmt;
    ResultSet *res;
    PreparedStatement *prep_stmt;
    Savepoint *savept;

    int updatecount = 0;

    /* initiate url, user, password and database variables */
    string url(argc >= 2 ? argv[1] : DBHOST);
    const string user(argc >= 3 ? argv[2] : USER);
    const string password(argc >= 4 ? argv[3] : PASSWORD);
    const string database(argc >= 5 ? argv[4] : DATABASE);

    try {
        driver = get_driver_instance();

        /*blah blah yada yada*/

    } catch (std::runtime_error &e) {

        cout << "ERROR: runtime_error in " << __FILE__;
        //cout << " (" << __func__ << ") on line " << __LINE__ << endl;
        cout << "ERROR: " << e.what() << endl;

        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
} // main()

你猜怎么着? 是的,这里再次出现链接器错误:

error LNK2001: unresolved external symbol _get_driver_instance

所以,请任何人告诉我我在做什么错? 将不胜感激。

我将对其进行明确声明并以粗体字写出,这样就不会有任何答案。 我已经明确设置了首选项-> C / C ++->常规->其他包含目录以及首选项->链接器->常规->其他库目录。

另外,我已经将mysqlcppconn.lib为Preferences-> mysqlcppconn.lib > Additional Dependencies。

另外,我已经将mysqlcppconn.dlllibmysql.dll (是,来自相应的C ++连接器版本)放入我的项目文件夹,对此没有任何问题。

哦,是的,在“预处理程序定义”中,无论是否使用CPPCONN_PUBLIC_FUNC=键,我都尝试过-没有发生任何更改。

就像我说过的-在相同的项目首选项下,连接器1.0.5版在构建阶段失败,而1.1.0版在编译阶段失败。

ps我正在使用VS 2010,我的操作系统-Windows 7 x64。 项目和库都是x32。

3 个回复

我遇到了同样的问题“无法正确启动(0xc000007b)”。 问题是,即使我已经安装(并重新安装)了64位mysql,也没有使用正确的DLL(使用x86而不是x64)。

我已经添加了mysqlcppconn.dll(用于x64)所在的PATH变量“ C:\\ MySQL \\ Connector C ++ 1.1.3 \\ lib \\ opt”。 不过,在我的PATH中,还有另一个目录(lua安装),它具有mysqlcppconn.dll(用于x86)。 由于x86目录是在MySQL目录之前设置的,因此x86 dll已加载,因此“无法启动...”

为了避免这种情况,我将mysqlcppconn.dll复制到了我的项目调试目录中。

尝试创建一个新项目并仅创建一个简单的数据库连接器,我这里没有可用的窗口,因此我只能向您展示我的Linux示例:

我可以看到的区别是您使用了prepare_statement,您可以尝试使用该语句,并且仅在链接器中包含mysqlcppconn.dll并查看此“小型项目”是否可以编译吗? 也许您有太多的库,但是如果这可以解决您的问题,那么简单的测试将使您更容易识别问题,而不是知道这些库不应该包含在一起。

如果那不起作用,请告诉我,我将尝试扩展答案。

这里我包括:

#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(){

sql::Driver *driver;
sql::Connection *con;
sql::Statement *stmt;
sql::ResultSet *res;
sql::Statement *pstmt;

try{
    driver = get_driver_instance();
    con = driver->connect("localhost", "root", "root");
    con->setSchema("test");
    stmt = conn->createStatement();

    /*blah blah yada yada*/

    }catch(sql::SQLException &e){
        std::cout<<e.what();
    }

}

我遇到了同样的“无法启动”问题,经过一番痛苦后,我解决了这个问题。 不幸的是,您在第一篇文章中的免责声明表明您已经尝试了我的解决方案,但是我将向我自己证明自己使用了错误类型的DLL的过程进行了发布(我最初还确定我使用了正确的DLL位) DLL)。 如果您仍然非常确定自己拥有正确的DLL / LIB,那么请转到“使用进程监视器调试”部分。

我的问题是我的生成后脚本从错误的位置复制了DLL。 我花了很多时间试图确保我的DLL目录中包含正确的内容,但是事实证明,我的构建后脚本不是从该目录复制的,因此在x86应用程序旁边复制了x64 DLL。

工具:-Dependency Walker(http://www.dependencywalker.com/)-Process Monitor(http://technet.microsoft.com/zh-cn/sysinternals/bb896645.aspx)

步骤:-制作一个可以编译并正常运行的项目。 我制作了一个控制台应用程序,并粘贴了MySQL连接器示例代码。 在下面。 请注意,我已经使用#pragma comment(lib)来包含lib,因此您甚至不需要弄乱include库,而只需弄乱目录。

/* Copyright 2008, 2010, Oracle and/or its affiliates. All rights reserved.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

There are special exceptions to the terms and conditions of the GPL
as it is applied to this software. View the full text of the
exception in file EXCEPTIONS-CONNECTOR-C++ in the directory of this
software distribution.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

/* Standard C++ includes */
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>

/*
  Include directly the different
  headers from cppconn/ and mysql_driver.h + mysql_util.h
  (and mysql_connection.h). This will reduce your build time!
*/
#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#pragma comment(lib,"mysqlcppconn.lib")
#pragma comment(lib,"libmysql.lib")
using namespace std;

int main(void)
{
cout << endl;
cout << "Running 'SELECT 'Hello World!' AS _message'..." << endl;

try {
  sql::Driver *driver;
  sql::Connection *con;
  sql::Statement *stmt;
  sql::ResultSet *res;

  /* Create a connection */
  driver = get_driver_instance();
  con = driver->connect("tcp://127.0.0.1:3306", "root", "password");
  /* Connect to the MySQL test database */
  con->setSchema("test");

  stmt = con->createStatement();
  res = stmt->executeQuery("SELECT 'Hello World!' AS _message");
  while (res->next()) {
    cout << "\t... MySQL replies: ";
    /* Access column data by alias or column name */
    cout << res->getString("_message") << endl;
    cout << "\t... MySQL says it again: ";
    /* Access column fata by numeric offset, 1 is the first column */
    cout << res->getString(1) << endl;
  }
  delete res;
  delete stmt;
  delete con;

} catch (sql::SQLException &e) {
  cout << "# ERR: SQLException in " << __FILE__;
  cout << "(" << __FUNCTION__ << ") on line "<< __LINE__ << endl;
  cout << "# ERR: " << e.what();
  cout << " (MySQL error code: " << e.getErrorCode();
  cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}

cout << endl;

return EXIT_SUCCESS;
}

如果在设置目录后该代码不起作用,那么您真的需要仔细检查所使用的DLL和LIB是正确的32/64位。 您可以使用依赖项遍历器来做到这一点。

如何使用依赖项遍历器:1)将DLL或EXE拖到DepWalk窗口中。 在丑陋的模块列表中(在日志上方的窗口中),找到您拖入的DLL / EXE,并确保“ CPU”列中的CPU类型与预期的一样。

流程监控器调试:如果上面的玩具代码为您编译,那么现在您正在讨论! 您有一个示例应用程序可以正常启动,而破烂的应用程序则无法启动。 启动过程监视器,将过滤器设置为仅包含玩具应用程序,然后运行它。 File->保存该日志,将过滤器更改为损坏的应用程序的进程名称,然后对损坏的应用程序再次进行处理。 现在,您可以比较两个应用程序与mySQL DLL的运行情况,甚至可以弄清楚它们在哪里损坏。 就我而言,我注意到它正在正确的位置加载libmysql.dll,然后在其他位置进行搜索。 我正确地推断出这意味着我有错误的LibMySQL.dll。 那可能不是您的问题,但是我敢打赌,您将通过过程监视器获得一些见解。

1 链接MySQL C连接器?

我正在使用Visual Studio 2012 , x64发布模式 , 多线程运行时库编写C ++程序。 我的项目还包含链接的boost 1.55.0库。 我试图以某种方式获得MySQL C连接器 (C ++连接器编写不当,所以我决定使用C)工作。 它可以工作,但是我遇到了随机崩溃,并 ...

2 Mysql Connector connect()问题

我有一个小型C ++项目,需要从中访问mySQL DB,所以我已经为C ++设置了mySQL Connector。 这是在OS X 10.10上完成的,我在编译/链接方面没有任何问题。 我已经为所有mysql东西编写了一个类,并且在构造函数中我想设置与db的连接。 但是,这似乎有点困难 ...

2016-09-13 19:04:56 2 267   c++/ mysql
3 MySQL连接器问题

我遇到一个问题,如果更改MySQL连接器Jar版本,我会得到某些错误。 我的代码在JBoss版本4.0.4.GA上运行良好。 然后,我使用连接器jar版本mysql-connector-java-5.1.36-bin将JBoss升级到Wildfly,并且未对运行良好的代码进行任何更改。 现 ...

4 MySQL Connector Net 6.8.3的问题

所以我在连接.NET和MySQL时遇到了一些问题,并发现连接器出了点问题。 进入我的控制面板-&gt;卸载/修复-&gt;修复MySQL Connector Net 6.8.3。 修复正常开始,但是几秒钟后,屏幕上显示“安装过程中发生了严重问题”。 我尝试重新安装它,但刚安装到MySQ ...

5 C++ MySql 连接器问题

我正在 Visual Studio 2019 中编写一个 C++ 程序,该程序使用 C++ MySql 连接器连接到本地 MySql 数据库。 我正在使用 MySQL 网站上提供的示例代码。 但是,无论我尝试什么,我都会遇到相同的错误: 我很确定它与这行代码有关,因为删除它可以消除错误 ...

6 MySQL C ++连接器-链接错误

美好的一天,我正在尝试使用MySQL C ++连接器,但是,出现以下错误: 未定义对`imp__ZN3sql5mysql19get_driver_instanceEv'的引用 我确定我正确链接了所有内容,否则它甚至无法识别其他与MySQL相关的定义(我认为)。 我的代码: ...

7 MySQL C ++连接器链接错误

大家。 我想使用C ++连接Mysql,但是不起作用:错误信息是: 而且我在stackoverflow中搜索了相同的问题,但是它没有适当的答案。 我的代码是: 谢谢。 ...

2014-08-30 06:42:19 1 1335   c++/ mysql
8 MySQL C++ 连接器链接错误

我正在尝试建立与 MySQL 数据库的连接。 代码编译得很好,但是在链接时我总是出错。 我尝试了动态和静态链接,但没有任何效果。 一些错误: 我使用最新版本的连接器。 如果你想检查设置,你可以在这里下载项目。 有人有想法吗? ...

10 C ++ mySQL Connector静态库链接

作为一名新的C ++程序员,我试图编写一个使用MySQL Connector XDevAPI静态库与MySQL数据库交互的C ++程序。 我无法计算出正确的库以进行链接以使程序得以编译。 这(或类似问题)似乎在MySQL Connector中很常见,但是我从stackoverflow或MySQL论坛 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM