
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.60] |
![]() |
|
Страницы: (6) [1] 2 3 ... 5 6 все ( Перейти к последнему сообщению ) |
![]() |
|
|
Здравствауте!
Подскажите, пожалуйста, из-за чего эта ошибка и как ее исправить?: Ошибка LNK2019 ссылка на неразрешенный внешний символ __imp__invalid_parameter в функции "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl std::operator+<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &&,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &&)" (??$?HDU?$char_traits@D@std@@V?$allocator@D@1@@std@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@$$QEAV10@0@Z). school D:\Programming\VS\source\repos\school\school\school.obj 1 ![]() ![]() #include <iostream> #include <memory> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/driver.h> #include <cppconn/exception.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> #include <cppconn/prepared_statement.h> //using namespace std; class MySQLConnection { private: std::unique_ptr<sql::Connection> connection; public: MySQLConnection(const std::string& host, int port, const std::string& user, const std::string& password, const std::string& database) { sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance(); std::string connectionString = "tcp://" + host + ":" + std::to_string(port); connection.reset(driver->connect(connectionString, user, password)); connection->setSchema(database); } void executeQuery(const std::string& query) { std::unique_ptr<sql::Statement> stmt(connection->createStatement()); std::unique_ptr<sql::ResultSet> res(stmt->executeQuery(query)); while (res->next()) { // Обработка результатов std::cout << "Результат: " << res->getString(1) << std::endl; } } bool isConnected() { return connection.get() != nullptr && !connection->isClosed(); } }; int main() { try { MySQLConnection db( "your_remote_server_ip", 3306, "your_username", "your_password", "your_database" ); if (db.isConnected()) { std::cout << "Подключение установлено успешно!" << std::endl; db.executeQuery("SELECT VERSION()"); } } catch (sql::SQLException& e) { std::cerr << "MySQL Error: " << e.what() << std::endl; } return 0; } |
Сообщ.
#2
,
|
|
|
Если у кого-то есть желание, посмотрите проект: https://disk.yandex.ru/d/1Jpu8d2JXhMkgw
|
Сообщ.
#3
,
|
|
|
DDim1000, привет!
От всей души тебя благодарю за "вчерашний кроссворд" ![]() Вот такая получилась Преамбула. "А почему с Майкрософтом почти дел не имел всё это время?" - возникает резонный вопрос. Отвечу честно: не знаю! Какое-то внутреннее отвращение. Но буквально месяц назад я для себя решил. Надо перебороть себя, поставить студию, и попробовать ее в действии. Даже если блевать тянет. И ТАК Моя "первичная" установка "Microsoft Visual Studio Enterprise 2022" не встала как надо, я её нахрен снёс, даже стандартных заголовков типа math.h не видела. Мать-её-перемать, удалил и поставил "Microsoft Visual Studio Community 2022". И вот тут стало уже интереснее: 1) Стандартное консольное приложение "Хэлоу ворлд!" заработало 2) Я скопировал код твой проги "сканнар". Понятное дело, даже на первом этапе в редакторе не виделись заголовки, но стало ещё интереснее СЕКРЕТНЫЙ СЕКРЕТ Скрытый текст А он заключается в том, что все пути твоего проекта - не соответствуют путям моего проекта в данном ответе. И с этим нужно смириться, но извлечь из этого полезную инфу как-то надо. Уверяю - надо! Просто нужно заценить аналогию и внести правки в свой проект. Это как два байта об асфальт, ну или одно из двух? РЕШАЕМ 1) Прописываем "пути заголовок в MySQL" в опциях проекта. Т.е. добавляем: "Свойства->Каталоги С++->Включаемые каталоги путь. В моём случае "E:\Documents\3.Projects\C++\TestMySQL\mysql\include\jdbc" 2) Прописываем "пути либ MySQL" в опциях проекта. Т.е. добавляем: "Свойства->Каталоги С++->Каталоги библиотек. В моём случае "E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64"и E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14 3) Прописываем конкретные добавляемые либы. Тут опять, понятное дело, у тебя свое размещение, у меня - своё. Поэтому - ориентируйся! "Свойства->Компоновщик->Все параметры->Дополнительные зависимости" У меня получилось прописать дополнительно: После всего сказанного - проект (солюшен) собрался успешно. В ОБЩЕМ В общем - была проблема сборки (линкинга). Не добавили и не указали нужные либы и их пути для сборки как должно. |
![]() |
Сообщ.
#4
,
|
|
![]() ![]() template <typename Ch, typename Tr, typename Al> std::basic_string<Ch, Tr, Al> operator+(std::basic_string<Ch, Tr, Al>&&, std::basic_string<Ch, Tr, Al>&&); Прикреплённая картинка
Она сообщает, что когда оба параметра оператора являются rvalue ref, реализация вправе считать, что они оба уникальны и не могут совпадать. И это логично, т.к. rvalue ref формально являются временными объектами и получить более одной ссылки на один и тот же временный объект невозможно иначе, как спецом написать кривой код. Я этого добился, явно переместив lvalue с помощью std::move() дважды в одном выражении, в итоге попробовав сконкатенировать некую строку со строкой, которая хранит невесть что. Как бы там ни было, в релизе _invalid_parameter() не используется. Вообще ничего отладочного не используется, что конечно не означает, что баг в программе сам собой вылечивается. Почему линкер не нашёл этого символа, ябеспонятия. Первое, что приходит в голову – отсутствие #include <string>, что само по себе является ошибкой, ведущей к undefined behavior. Но не исключено, что это баг мэйкера проекта, который не добавил нужную DLL. Точнее, либу импорта к ней. Я бы попробовал отключить динамическую RTL и использовать статическую. Если баг линковки исчезнет, то это баг сборки самой динамической RTL, и об этом нужно сообщить в саппорт Студии |
![]() |
|
|
Цитата Majestio @ DDim1000, привет! От всей души тебя благодарю за "вчерашний кроссворд" ![]() Вот такая получилась Преамбула. "А почему с Майкрософтом почти дел не имел всё это время?" - возникает резонный вопрос. Отвечу честно: не знаю! Какое-то внутреннее отвращение. Но буквально месяц назад я для себя решил. Надо перебороть себя, поставить студию, и попробовать ее в действии. Даже если блевать тянет. И ТАК Моя "первичная" установка "Microsoft Visual Studio Enterprise 2022" не встала как надо, я её нахрен снёс, даже стандартных заголовков типа math.h не видела. Мать-её-перемать, удалил и поставил "Microsoft Visual Studio Community 2022". И вот тут стало уже интереснее: 1) Стандартное консольное приложение "Хэлоу ворлд!" заработало 2) Я скопировал код твой проги "сканнар". Понятное дело, даже на первом этапе в редакторе не виделись заголовки, но стало ещё интереснее СЕКРЕТНЫЙ СЕКРЕТ Скрытый текст А он заключается в том, что все пути твоего проекта - не соответствуют путям моего проекта в данном ответе. И с этим нужно смириться, но извлечь из этого полезную инфу как-то надо. Уверяю - надо! Просто нужно заценить аналогию и внести правки в свой проект. Это как два байта об асфальт, ну или одно из двух? РЕШАЕМ 1) Прописываем "пути заголовок в MySQL" в опциях проекта. Т.е. добавляем: "Свойства->Каталоги С++->Включаемые каталоги путь. В моём случае "E:\Documents\3.Projects\C++\TestMySQL\mysql\include\jdbc" 2) Прописываем "пути либ MySQL" в опциях проекта. Т.е. добавляем: "Свойства->Каталоги С++->Каталоги библиотек. В моём случае "E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64"и E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14 3) Прописываем конкретные добавляемые либы. Тут опять, понятное дело, у тебя свое размещение, у меня - своё. Поэтому - ориентируйся! "Свойства->Компоновщик->Все параметры->Дополнительные зависимости" У меня получилось прописать дополнительно: После всего сказанного - проект (солюшен) собрался успешно. В ОБЩЕМ В общем - была проблема сборки (линкинга). Не добавили и не указали нужные либы и их пути для сборки как должно. Majestio, большое, большое спасибо!!! Я 2 дня седел на разных форумах, но никто не мог толком ничего подсказать. А ты разобрался, и все так четко объяснил! |
![]() |
|
|
Проект компилируеться, но возникла еще одна ошибка.
При выполнении программы выскакивает сообщение: Не удается продолжить выполнение кода, поскольку система не обноружила mysqlcppconn-10-vs14.dll. Для устранеия этой пролемы попробуйте переустанвить программу. Но когда я прописыва путь к mysqlcppconn-10-vs14.dll, при сборки проета выходит ошибка: Ошибка LNK1107 недопустимый или поврежденный файл: не удается прочитать по 0x388 school D:\Programming\VS\source\repos\school\school\MySQL\lib64\mysqlcppconn-10-vs14.dll Подскажите, пожалуста, как исправить ошибку? Прикреплённая картинка
P.S. Как здесь изображения прикреплять? |
Сообщ.
#7
,
|
|
|
Цитата DDim1000 @ Не удается продолжить выполнение кода, поскольку система не обноружила mysqlcppconn-10-vs14.dll. Для устранеия этой пролемы попробуйте переустанвить программу. Обычно для загрузки внешних DLL-либ ничего прописывать не нужно. Нужно лишь обеспечить их загрузку. Самым простым образом это решается двумя способами: Я бы посоветовал первый способ. А вообще лучше глянь страничку на моём сайте, и сам реши для себя как тебе лучше. |
Сообщ.
#8
,
|
|
|
Цитата DDim1000 @ Majestio, большое, большое спасибо!!! Я 2 дня седел на разных форумах, но никто не мог толком ничего подсказать. А ты разобрался, и все так четко объяснил! Это супер! Хорошо, что ты пришёл на наш форум. Оставайся тут, сделай закладочку в своём браузере на наш форум. Через месяц-два это уже будет не "наш" а "твой" форум. Да, конечно "трафик общения" тут не большой. Но, уверяю тебя, тут очень много интересных и толковых людей! Хотя ... о чём я ![]() |
Сообщ.
#9
,
|
|
|
Сообщ.
#10
,
|
|
|
Ну тут уже проще, явная ошибка в коде твоей программы. Самый простой вариант ее найти - пошаговое исполнение в отладчике. Кода у тебя там мало, найдешь достаточно быстро.
|
Сообщ.
#11
,
|
|
|
Ошибка происходит вот на эти строках:
![]() ![]() connection.reset(driver->connect(connectionString, user, password)); connection->setSchema(database); Вот видео: https://rutube.ru/video/private/4a2d373fed2...P7X9cVc0_Tu7uZw |
![]() |
Сообщ.
#12
,
|
|
Очень подозреваю, что SQL собрана версией Студии, отличной от твоей. Попытка сконструировать SQLString где-то изнутри DLL наталкивается на совершенно дикие значения размеров памяти, типа 435626798759 байт. Что очень похоже на нарушение ODR.
Думаю, нужно либо выяснить, какой версией собирались твои DLLки и использовать ту же, либо пересобрать самому из сырцов. Добавлено Но возможно, что причина в другом. Всё-таки ![]() ![]() KernelBase.dll!RaiseException() Нет данных vcruntime140.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) Строка 80C++ mysqlcppconn-10-vs14.dll!__scrt_throw_std_bad_alloc() Строка 35C++ > mysqlcppconn-10-vs14.dll!operator new(unsigned __int64 size) Строка 48C++ [Внедренный фрейм] mysqlcppconn-10-vs14.dll!std::_Default_allocate_traits::_Allocate(const unsigned __int64) Строка 79C++ mysqlcppconn-10-vs14.dll!std::_Allocate_manually_vector_aligned<std::_Default_allocate_traits>(const unsigned __int64 _Bytes) Строка 134C++ [Внедренный фрейм] mysqlcppconn-10-vs14.dll!std::_Allocate(const unsigned __int64) Строка 229C++ [Внедренный фрейм] mysqlcppconn-10-vs14.dll!std::allocator<char>::allocate(const unsigned __int64 _Count) Строка 801C++ [Внедренный фрейм] mysqlcppconn-10-vs14.dll!std::string::_Construct_lv_contents(const std::string &) Строка 2908C++ mysqlcppconn-10-vs14.dll!std::string::basic_string<char,std::char_traits<char>,std::allocator<char>>(const std::string & _Right) Строка 2420C++ [Внедренный фрейм] mysqlcppconn-10-vs14.dll!sql::SQLString::{ctor}(const sql::SQLString &) Строка 66C++ [Внедренный фрейм] mysqlcppconn-10-vs14.dll!sql::Variant::{ctor}(const sql::SQLString &) Строка 277C++ mysqlcppconn-10-vs14.dll!sql::mysql::MySQL_Connection::MySQL_Connection(sql::Driver * _driver, sql::mysql::NativeAPI::NativeConnectionWrapper & _proxy, const sql::SQLString & hostName, const sql::SQLString & userName, const sql::SQLString & password) Строка 162C++ mysqlcppconn-10-vs14.dll!sql::mysql::MySQL_Driver::connect(const sql::SQLString & hostName, const sql::SQLString & userName, const sql::SQLString & password) Строка 130C++ school.exe!MySQLConnection::MySQLConnection(const std::string & host, int port, const std::string & user, const std::string & password, const std::string & database) Строка 26C++ school.exe!main() Строка 47C++ school.exe!invoke_main() Строка 79C++ school.exe!__scrt_common_main_seh() Строка 288C++ school.exe!__scrt_common_main() Строка 331C++ school.exe!mainCRTStartup(void * __formal) Строка 17C++ kernel32.dll!BaseThreadInitThunk() Нет данных ntdll.dll!RtlUserThreadStart() Нет данных |
Сообщ.
#13
,
|
|
|
Цитата Qraizer @ Очень подозреваю, что SQL собрана версией Студии, отличной от твоей. ... Что это значит? Версия библиотеки не та? |
![]() |
Сообщ.
#14
,
|
|
Ну... наверное. Косвенно это также ещё следует из названия "mysqlcppconn-10-vs14.dll", что скорее всего «но это неточно©» означает сборку на 14-ой версии RTL. Нынешняя ВизуалСтудия2022 имеет 17-ую версию.
Добавлено Технически пересобрать не должно быть неподъёмным процессом. Весь мир опенсорса так работает. На пересборке пререквизитов в конечной точке, в смысле. Но нынче MySQL под Oracle-ом, а его отношение к опенсорс довольно невнятное. Добавлено Ещё есть мысль: попробовать отключить отладочную RTL и заюзать релизную вместо. Кстати, вполне может помочь, т.к. отладочная реализация 100пудово отличается от релизной, откуда и может следовать нарушение ODR. Т.е. SQL собрана с релизной RTL, а твоё приложение с отладочной, и это и есть источник проблемы. Добавлено P.S. Просто переключи Конфигурацию решения в Release: ![]() ![]() MySQL Error: Unable to connect to your_remote_server_ip:3306 |
Сообщ.
#15
,
|
|
|
Когда я переключаю на Release, то сразу вот эти строки подсвечиваются красной чертой. То есть библиотеки становятся не достуаны.
#include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/driver.h> #include <cppconn/exception.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> #include <cppconn/prepared_statement.h> |