CMakeList о конфигурации MySQL Connector c ++ 8.0 - PullRequest
1 голос
/ 13 января 2020

Я не очень хорош в английском sh, пожалуйста, прости меня за синтаксическую ошибку. Я хочу сделать mysql проект в Linux / windows с помощью Cmake, поэтому я использую Visual Studio для редактирования. И я создаю проект cmake в visual studio, во-первых, я только тестирую повышение в моем проекте, он успешно выполняется.

find_package(Boost
            )
if (Boost_FOUND)
    message(STATUS "find Boost:\"${Boost_INCLUDE_DIRS}\",ENABLE_BOOST is opened")
    message(STATUS "find Boost:\"${Boost_LIBRARIES}\"")
    include_directories(${Boost_INCLUDE_DIRS})
    link_directories(${Boost_LIBRARY_DIRS})
endif (Boost_FOUND)

Я могу запустить тест по файловой системе, поэтому я хочу установить mysql разъем c ++ 8.0

include_directories("C:/Program Files/MySQL/MySQL Connector C++ 8.0/include")
link_directories("C:/Program Files/MySQL/MySQL Connector C++ 8.0/lib64/vs14")
link_directories("C:/Program Files/MySQL/mysql-8.0.18-winx64/lib")
add_executable (test "test.cpp")
target_link_libraries(test mysqlcppconn.dll libmysql.dll)

и я копирую lib mysql .dll и mysqlcppconn.lib (я не могу найти mysqlcppconn.dll, но могу использовать Visual Studio обычным проектом, успешно запущенным через mysqlcppconn.lib ) в мой проект cmake с test. cpp

, поэтому я запускаю код, но отображается сообщение об ошибке 0x00007FFEE1DBE710 (ucrtbased.dll), место чтения нарушения прав доступа в xstring.insert.h ( ms .h? я не знаю этот заголовок)

мой код есть, и я успешно запускаю обычный проект через vs2017, но cmake не может работать.

int main()
{
    cout << "Hello CMake。" << endl;
    cout << "You Finished." << endl;
    string exepath = boost::filesystem::initial_path<boost::filesystem::path>().string();
    cout << exepath << endl;
    try {
        sql::Driver *driver;
        sql::Connection *con;
        sql::Statement *stmt;
        sql::ResultSet *res;
        cout << "create success" << endl;
        driver = get_driver_instance();
        con = driver->connect("localhost", "root", "123");
        con->setSchema("test");
        stmt = con->createStatement();
        res = stmt->executeQuery("select * from detect");
        cout << "search..."<<endl;
        while (res->next()) {
            cout << "searhing..username:" << endl;
            cout << res->getString("username") << endl;
            cout << "searhing..password:" << endl;
            cout << res->getString("password") << 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 << "link failed" << endl;

    }
return 0;
}

Я отлаживаю код, и это ошибка в

cout << res->getString("username") << endl;

Я обещаю, что с моими таблицами все в порядке

, и я успешно запускаю код через mysql c api через проект Visual Studio cmake, но mysql разъем с ++ не может.

если вы можете сказать мне, что я должен делать, спасибо, что я очень много!

Обновление: @Alex Я запускаю код, затем Visual Studio Auto go xstring_insert.h

// xstring_insert.h internal header
// Copyright (c) Microsoft Corporation. All rights reserved.
if (_State == ios_base::goodbit
            && _Ostr.rdbuf()->sputn(_Data, (streamsize)_Size)
                != (streamsize)_Size)
                _State |= ios_base::badbit;

Моя ошибка происходит в if (). И визуальная студия выводит

Exception thrown at 0x00007FFEF776E710 (ucrtbased.dll) in test.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

@ seccpur. Я добавляю .c_str () в свой код cout, и я успешно запускаюсь, не могли бы вы сказать, почему мне нужно это сделать. И я не использую .c_str (), который может успешно выполнять код в моей общей консоли windows.

1 Ответ

0 голосов
/ 13 января 2020

Ошибка не требует пояснений. Он говорит:

Access violation reading location 0xFFFFFFFFFFFFFFFF.

Другими словами, вы пытаетесь прочитать адрес 0xFFFFFFFFFFFFFFFF (= -1), но у вас нет разрешения на его чтение.

Давайте теперь посмотрим на Ваше if утверждение, поскольку вы выяснили, в чем проблема.

if (_State == ios_base::goodbit
        && _Ostr.rdbuf()->sputn(_Data, (streamsize)_Size)
            != (streamsize)_Size)

Давайте посмотрим, какая из этих частей может вызвать эту ошибку: в

_State == ios_base::goodbit

вы сравниваете один объект с другим. Такой ошибки не должно появиться. В

    && _Ostr.rdbuf()->sputn(_Data, (streamsize)_Size)

вы следуете за указателем _Ostr.rdbuf(). Если это значение равно -1, это приведет к указанной вами ошибке.

Наконец, в последней строке вы снова сравниваете два значения, поэтому ошибка невозможна. Теперь вы знаете, в чем причина этой ошибки. Таким образом, рассматриваемая библиотека должна убедиться, что _Ostr.rdbuf() является допустимым значением, прежде чем пытаться следовать его указателю: очевидно, не все библиотеки делают.

С другой стороны, cstring() принимает значение и преобразует это в строку, даже если это НЕ допустимо. Вот почему его использование работает в этом случае.

Хорошая работа по улучшению вашего вопроса. Первый вопрос звучал ужасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...