На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (6) [1] 2 3 ...  5 6 все  ( Перейти к последнему сообщению )  
> Как исправить ошибку: "LNK2019 ссылка на неразрешенный внешний символ"?
    Здравствауте!
    Подскажите, пожалуйста, из-за чего эта ошибка и как ее исправить?:

    Ошибка 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

    ExpandedWrap disabled
      #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;
      }
    Сообщение отредактировано: DDim1000 -
      Если у кого-то есть желание, посмотрите проект: https://disk.yandex.ru/d/1Jpu8d2JXhMkgw
        DDim1000, привет!

        От всей души тебя благодарю за "вчерашний кроссворд" :lol: Дело все в том, что за свою 35-летнюю практику программирования я сегодня 1-й раз запустил компиляцию программы на С++ с помощью компилятора от Microsoft. Всё это "мелкомягкое" проходило мимо меня. Сперва совсем другие языки программирования: Turbo Pascal, потом Delphi, потом за злобу дня Virtual Pascal, потом Free Pascal. А потом вообще ударился в "экзотику" - REXX от OS/2, MEX от системы Maximus BBS, Clarion for DOS, потом Windows. Потом пришёл к Borland C++ Builder'у. Но и тут настигло разочарование!!! В языке программирования С++ есть Стандарт (потом они появятся и в других), и его нельзя членососить!!! А Borland это делал не стесняясь. Поэтому я ушел. Увидел в фрэймворке Qt дружественный интерфейс, и завязанный на Стандарт, и завязанный, как бонус, ещё и на кроссплатформенность.

        Вот такая получилась Преамбула. "А почему с Майкрософтом почти дел не имел всё это время?" - возникает резонный вопрос. Отвечу честно: не знаю! Какое-то внутреннее отвращение. Но буквально месяц назад я для себя решил. Надо перебороть себя, поставить студию, и попробовать ее в действии. Даже если блевать тянет.

        И ТАК

        Моя "первичная" установка "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\lib64E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14
        3) Прописываем конкретные добавляемые либы. Тут опять, понятное дело, у тебя свое размещение, у меня - своё. Поэтому - ориентируйся! "Свойства->Компоновщик->Все параметры->Дополнительные зависимости"

        У меня получилось прописать дополнительно:
        • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\libcrypto.lib
        • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\libssl.lib
        • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconn.lib
        • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconn-static.lib
        • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconnx.lib
        • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconnx-static.lib
        После всего сказанного - проект (солюшен) собрался успешно.

        В ОБЩЕМ

        В общем - была проблема сборки (линкинга). Не добавили и не указали нужные либы и их пути для сборки как должно.
          ExpandedWrap disabled
            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>&&);
          является сугубо Стандартным, никакого к SQL отношения не имеющим. Имя __imp__invalid_parameter является импортируемым входом из библиотеки импорта для DLL, в которой лежит реализация стандартной RTL от Майкрософта. Исходное имя _invalid_parameter является функцией, задействованной в отладочной сборке RTL, через которую сообщается о тех или иных багах в коде, которые обнаруживаются в runtime. Обычно это всякоразные нарушения Стандарта, которые невозможно определить при компиляции и Стандартом описываемые как "undefined behavior" и "no diagnostic is required", например, использование инвалидированного итератора. У меня бага, обнаруживаемая этим оператором в его отладочной форме, выглядит вот так:
          Прикреплённая картинка
          Прикреплённая картинка

          Она сообщает, что когда оба параметра оператора являются rvalue ref, реализация вправе считать, что они оба уникальны и не могут совпадать. И это логично, т.к. rvalue ref формально являются временными объектами и получить более одной ссылки на один и тот же временный объект невозможно иначе, как спецом написать кривой код. Я этого добился, явно переместив lvalue с помощью std::move() дважды в одном выражении, в итоге попробовав сконкатенировать некую строку со строкой, которая хранит невесть что.
          Как бы там ни было, в релизе _invalid_parameter() не используется. Вообще ничего отладочного не используется, что конечно не означает, что баг в программе сам собой вылечивается. Почему линкер не нашёл этого символа, ябеспонятия. Первое, что приходит в голову – отсутствие #include <string>, что само по себе является ошибкой, ведущей к undefined behavior. Но не исключено, что это баг мэйкера проекта, который не добавил нужную DLL. Точнее, либу импорта к ней. Я бы попробовал отключить динамическую RTL и использовать статическую. Если баг линковки исчезнет, то это баг сборки самой динамической RTL, и об этом нужно сообщить в саппорт Студии
          Сообщение отредактировано: Qraizer -
            Цитата Majestio @
            DDim1000, привет!

            От всей души тебя благодарю за "вчерашний кроссворд" :lol: Дело все в том, что за свою 35-летнюю практику программирования я сегодня 1-й раз запустил компиляцию программы на С++ с помощью компилятора от Microsoft. Всё это "мелкомягкое" проходило мимо меня. Сперва совсем другие языки программирования: Turbo Pascal, потом Delphi, потом за злобу дня Virtual Pascal, потом Free Pascal. А потом вообще ударился в "экзотику" - REXX от OS/2, MEX от системы Maximus BBS, Clarion for DOS, потом Windows. Потом пришёл к Borland C++ Builder'у. Но и тут настигло разочарование!!! В языке программирования С++ есть Стандарт (потом они появятся и в других), и его нельзя членососить!!! А Borland это делал не стесняясь. Поэтому я ушел. Увидел в фрэймворке Qt дружественный интерфейс, и завязанный на Стандарт, и завязанный, как бонус, ещё и на кроссплатформенность.

            Вот такая получилась Преамбула. "А почему с Майкрософтом почти дел не имел всё это время?" - возникает резонный вопрос. Отвечу честно: не знаю! Какое-то внутреннее отвращение. Но буквально месяц назад я для себя решил. Надо перебороть себя, поставить студию, и попробовать ее в действии. Даже если блевать тянет.

            И ТАК

            Моя "первичная" установка "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\lib64E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14
            3) Прописываем конкретные добавляемые либы. Тут опять, понятное дело, у тебя свое размещение, у меня - своё. Поэтому - ориентируйся! "Свойства->Компоновщик->Все параметры->Дополнительные зависимости"

            У меня получилось прописать дополнительно:
            • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\libcrypto.lib
            • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\libssl.lib
            • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconn.lib
            • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconn-static.lib
            • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconnx.lib
            • E:\Documents\3.Projects\C++\TestMySQL\mysql\lib64\vs14\mysqlcppconnx-static.lib
            После всего сказанного - проект (солюшен) собрался успешно.

            В ОБЩЕМ

            В общем - была проблема сборки (линкинга). Не добавили и не указали нужные либы и их пути для сборки как должно.

            Majestio, большое, большое спасибо!!!
            Я 2 дня седел на разных форумах, но никто не мог толком ничего подсказать. А ты разобрался, и все так четко объяснил!
            Сообщение отредактировано: DDim1000 -
              Проект компилируеться, но возникла еще одна ошибка.
              При выполнении программы выскакивает сообщение:


              Не удается продолжить выполнение кода, поскольку система не обноружила 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.
              Как здесь изображения прикреплять?
                Цитата DDim1000 @
                Не удается продолжить выполнение кода, поскольку система не обноружила mysqlcppconn-10-vs14.dll. Для устранеия этой пролемы попробуйте переустанвить программу.

                Обычно для загрузки внешних DLL-либ ничего прописывать не нужно. Нужно лишь обеспечить их загрузку. Самым простым образом это решается двумя способами:

                1. Или положить нужные .dll рядом с исполняемым .exe файлом
                2. Или нужные .dll записать в C:\Windows\System32

                Я бы посоветовал первый способ. А вообще лучше глянь страничку на моём сайте, и сам реши для себя как тебе лучше.
                  Цитата DDim1000 @
                  Majestio, большое, большое спасибо!!!
                  Я 2 дня седел на разных форумах, но никто не мог толком ничего подсказать. А ты разобрался, и все так четко объяснил!

                  Это супер! Хорошо, что ты пришёл на наш форум. Оставайся тут, сделай закладочку в своём браузере на наш форум. Через месяц-два это уже будет не "наш" а "твой" форум. Да, конечно "трафик общения" тут не большой. Но, уверяю тебя, тут очень много интересных и толковых людей!

                  Хотя ... о чём я ;) Ты с нами уже с 2019 года. Просто не пропадай.
                    Теперь такая ошибка:

                    Debug Error!

                    Program: D:\Programming\VS\source\repos\school\x64\Debug\school.exe

                    abort() has been called

                    (Press Retry to debug the application)

                    Прикреплённая картинка
                    Прикреплённая картинка
                      Ну тут уже проще, явная ошибка в коде твоей программы. Самый простой вариант ее найти - пошаговое исполнение в отладчике. Кода у тебя там мало, найдешь достаточно быстро.
                        Ошибка происходит вот на эти строках:

                        ExpandedWrap disabled
                                  connection.reset(driver->connect(connectionString, user, password));
                                  connection->setSchema(database);


                        Вот видео: https://rutube.ru/video/private/4a2d373fed2...P7X9cVc0_Tu7uZw
                          Очень подозреваю, что SQL собрана версией Студии, отличной от твоей. Попытка сконструировать SQLString где-то изнутри DLL наталкивается на совершенно дикие значения размеров памяти, типа 435626798759 байт. Что очень похоже на нарушение ODR.
                          Думаю, нужно либо выяснить, какой версией собирались твои DLLки и использовать ту же, либо пересобрать самому из сырцов.

                          Добавлено
                          Но возможно, что причина в другом. Всё-таки
                          ExpandedWrap disabled
                                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()  Нет данных
                          и всё, что выше school.exe!MySQLConnection::MySQLConnection, без исходных текстов.
                            Цитата Qraizer @
                            Очень подозреваю, что SQL собрана версией Студии, отличной от твоей. ...

                            Что это значит? Версия библиотеки не та?
                              Ну... наверное. Косвенно это также ещё следует из названия "mysqlcppconn-10-vs14.dll", что скорее всего «но это неточно©» означает сборку на 14-ой версии RTL. Нынешняя ВизуалСтудия2022 имеет 17-ую версию.

                              Добавлено
                              Технически пересобрать не должно быть неподъёмным процессом. Весь мир опенсорса так работает. На пересборке пререквизитов в конечной точке, в смысле. Но нынче MySQL под Oracle-ом, а его отношение к опенсорс довольно невнятное.

                              Добавлено
                              Ещё есть мысль: попробовать отключить отладочную RTL и заюзать релизную вместо. Кстати, вполне может помочь, т.к. отладочная реализация 100пудово отличается от релизной, откуда и может следовать нарушение ODR. Т.е. SQL собрана с релизной RTL, а твоё приложение с отладочной, и это и есть источник проблемы.

                              Добавлено
                              P.S. Просто переключи Конфигурацию решения в Release:
                              ExpandedWrap disabled
                                MySQL Error: Unable to connect to your_remote_server_ip:3306
                                Когда я переключаю на 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>
                                Сообщение отредактировано: DDim1000 -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (6) [1] 2 3 ...  5 6 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0488 ]   [ 21 queries used ]   [ Generated: 23.10.25, 20:44 GMT ]