Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMakeList关于MySQL连接器c++;8.0配置_C++_Mysql_Cmake - Fatal编程技术网

C++ CMakeList关于MySQL连接器c++;8.0配置

C++ CMakeList关于MySQL连接器c++;8.0配置,c++,mysql,cmake,C++,Mysql,Cmake,我不擅长英语, 请原谅我的语法错误。 我想通过cmake在linux/windows中创建一个mysql项目,所以我使用visual studio进行编辑。 我在visual studio中创建了一个cmake项目, 首先,我只在我的项目中测试boost,它已经成功运行了 find_package(Boost ) if (Boost_FOUND) message(STATUS "find Boost:\"${Boost_INCLUDE_DIRS}\",ENABLE

我不擅长英语, 请原谅我的语法错误。 我想通过cmake在linux/windows中创建一个mysql项目,所以我使用visual studio进行编辑。 我在visual studio中创建了一个cmake项目, 首先,我只在我的项目中测试boost,它已经成功运行了

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 < /p>
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)
我复制libmysql.dll和mysqlcppcconn.lib(我找不到mysqlcppcconn.dll,但我可以通过mysqlcppcconn.lib成功运行一个普通项目来使用visual studio) 使用test.cpp访问我的cmake项目

所以我运行代码,但显示了一个错误 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;
}
我的错误发生在if()中。 VisualStudio的输出是

Exception thrown at 0x00007FFEF776E710 (ucrtbased.dll) in test.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
@seccpur
我在cout代码中添加了.c_str(),并且成功运行,您能告诉我为什么需要这样做吗?我没有使用.c_str()在我的通用windows控制台中成功运行代码。

错误是不言自明的。它说:

Access violation reading location 0xFFFFFFFFFFFFFFFF.
换句话说,您正试图读取地址0xFFFFFFFFFFFFFF(=-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)
您正在跟踪
\u Ostr.rdbuf()
的指针。如果该值为-1,则会导致您引用的错误

最后,在最后一行,再次比较两个值,这样就不可能出现错误。现在你知道这个错误的罪魁祸首是什么了。因此,有问题的库需要确保
\u Ostr.rdbuf()
是一个有效值,然后再尝试跟随它的指针:显然不是所有库都这样做

另一方面,
cstring()
接受该值并将其转换为字符串,即使该值无效。这就是在这种情况下使用它的原因


在改进你的问题方面做得很好。最初的问题听起来很糟糕。

错误是不言自明的。它说:

Access violation reading location 0xFFFFFFFFFFFFFFFF.
换句话说,您正试图读取地址0xFFFFFFFFFFFFFF(=-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)
您正在跟踪
\u Ostr.rdbuf()
的指针。如果该值为-1,则会导致您引用的错误

最后,在最后一行,再次比较两个值,这样就不可能出现错误。现在你知道这个错误的罪魁祸首是什么了。因此,有问题的库需要确保
\u Ostr.rdbuf()
是一个有效值,然后再尝试跟随它的指针:显然不是所有库都这样做

另一方面,
cstring()
接受该值并将其转换为字符串,即使该值无效。这就是在这种情况下使用它的原因


在改进你的问题方面做得很好。最初的问题听起来很糟糕。

你是什么意思,
(一个ms.h?我不知道这个标题)
?这是错误消息的一部分吗?请更新您的帖子以明确说明。请尝试
std::cout getString(“用户名”).c_str()我在问题中更新了我的帖子,并使用add.c_str()成功运行了代码。您能告诉我为什么需要在代码中添加.c_str()吗@亚历克斯你说,
(一个ms.h?我不知道这个标题)
是什么意思?这是错误消息的一部分吗?请更新您的帖子以明确说明。请尝试
std::cout getString(“用户名”).c_str()我在问题中更新了我的帖子,并使用add.c_str()成功运行了代码。您能告诉我为什么需要在代码中添加.c_str()吗@Alexxstring_insert.h不是我的编辑代码,我认为它是complie auto add标准代码,我的意思是我的cmakelist.txt编辑错误还是我的main.cpp代码错误?那么,我应该关心mysql连接器cmakelist.txt还是关心我的代码如何从mysql获取String()?我知道这一点(这就是为什么我说“库……需要……”)。我不确定你到底在问什么,但我相信第二部分是你需要关心的。xstring_insert.h不是我的编辑代码,我认为它是complie auto add标准代码,我的意思是我的cmakelist.txt编辑错误还是我的main.cpp代码错误?那么,我应该关心mysql连接器cmakelist.txt还是关心我的代码如何从mysql获取String()?我知道这一点(这就是为什么我说“库……需要……”)。我不确定你到底在问什么,但我相信第二部分是你需要关心的。