Проблемы MySQL Connector — Связывание и даже больше

Итак, я снова, ребята. После целого дня попыток найти решение для связи между libmysql.lib и mysqlclient.lib я полностью закончил. Итак, там я решил пойти другим путем и использовать удобный коннектор MySQL.

Поскольку в версии 1.1.0 используется технология 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 коннектора, а также библиотеки повышения. Чем создал новый проект, установите все зависимости, как и в первом, но указав на более новую версию соединителя. Кроме того, я установил новую ссылку 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 Настройки -> Линкер -> Дополнительные зависимости.

Рядом я положил mysqlcppconn.dll а также libmysql.dll (да, из соответствующих версий C ++ Connector) в папку моего проекта, не делайте с этим никаких проблем.

О, да, я пробовал как с, так и без CPPCONN_PUBLIC_FUNC= введите определения препроцессора — никаких изменений не произошло.

Как я уже сказал, с теми же параметрами проекта, версия 1.0.5 коннектора не работает на этапе сборки, а версия 1.1.0 — на этапе компиляции.

постскриптум Я использую VS 2010, моя ОС — Windows 7 x64. Оба проекта и библиотеки x32.

4

Решение

У меня была та же проблема «невозможно запустить правильно (0xc000007b)» точно. Проблема заключалась в том, что я не использовал правильную DLL (использовал x86 вместо x64), хотя я установил (и переустановил) mysql для 64-битной системы.

Я добавил в переменную PATH «C: \ MySQL \ Connector C ++ 1.1.3 \ lib \ opt», где находится mysqlcppconn.dll (для x64). Тем не менее, в моем PATH есть еще один каталог (установка lua), в котором есть mysqlcppconn.dll (для x86). Так как каталог x86 был задан до каталога MySQL, DLL-библиотека x86 была загружена и, следовательно, «не удалось запустить …»

Чтобы избежать этого, я скопировал mysqlcppconn.dll в каталог отладки моего проекта.

2

Другие решения

Попробуйте создать новый проект и просто создайте простой коннектор БД, у меня нет доступных окон, поэтому я могу показать вам только мой пример с Linux:

Разница, которую я вижу, в том, что вы используете подготовленный_стандарт, можете ли вы попробовать это утверждение и включить в свой компоновщик только 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();
}

}

0

У меня была та же самая проблема «неспособности начать», и после большой боли я решил ее. К сожалению, в вашем первом заявлении об отказе говорится, что вы уже опробовали мое решение, но я опубликую процесс, который я использовал, чтобы доказать себе, что у меня неправильный тип DLL (изначально я также был уверен, что использую правильный битрейт DLL). Если вы все еще уверены, что у вас есть правильный битрейт библиотек DLL / LIB, перейдите в раздел «отладка с помощью монитора процесса».

Моя проблема заключалась в том, что мои сценарии после сборки копировали DLL из неправильного места. Я потратил кучу времени, пытаясь убедиться, что в моем каталоге DLL есть нужные вещи, но оказывается, что мои сценарии после сборки не копировали из этого каталога, и поэтому копировали библиотеки x64 DLL вместе с моим приложением x86.

Инструменты:
-Уход за зависимостью (http://www.dependencywalker.com/)
Монитор процессов (http://technet.microsoft.com/en-ca/sysinternals/bb896645.aspx)

Процедура:
-Создать проект, который компилируется и запускается без проблем. Я сделал консольное приложение и вставил пример кода MySQL коннектора. Это ниже. Обратите внимание, что я использовал #pragma comment (lib) для включения lib, поэтому вам даже не нужно связываться с включениями библиотеки, только каталогами.

/* 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 соответствует ожидаемому.

Отладка монитора процессов:
Если код игрушки выше скомпилирован для вас, то теперь вы говорите! У вас есть пример приложения, которое запускается правильно, и приложение с разбитой задницей, которое не запускается. Запустите монитор процесса, установите фильтр, включающий только ваше игрушечное приложение, и запустите его. Файл-> сохранить этот журнал, замените фильтр на имя процесса вашего сломанного приложения, а затем сделайте это снова со своим сломанным приложением. Теперь вы можете сравнить, что эти два приложения работают с MySQL DLL, и, возможно, выяснить, где они ломаются. В моем случае я заметил, что он загружает libmysql.dll в нужном месте, а затем ищет его в других местах. Я правильно сделал вывод, что это означало, что у меня неправильный LibMySQL.dll. Это может не быть вашей проблемой, но я уверен, что вы получите некоторое представление о мониторе процессов.

0
По вопросам рекламы [email protected]