gpt4 book ai didi

c++ - CMakeList 关于 MySQL Connector c++ 8.0 配置

转载 作者:行者123 更新时间:2023-12-02 10:37:09 28 4
gpt4 key购买 nike

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

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)

我复制了 libmysql.dll 和 mysqlcppconn.lib(我找不到 mysqlcppconn.dll,但我可以通过 mysqlcppconn.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;
}

我调试代码,它是错误的
cout << res->getString("username") << endl;

我保证我的 table 没问题

我通过 mysql c api 通过 Visual Studio cmake 项目成功运行代码,但 mysql connector c++ 不能。

如果你能告诉我该怎么做,
非常感谢!

更新:
@亚历克斯
我运行代码,然后 Visual Studio 自动转到 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() 中。
Visual Studio 的输出是
Exception thrown at 0x00007FFEF776E710 (ucrtbased.dll) in test.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

@seccpur
我在我的 cout 代码中添加了 .c_str() ,并且我成功运行了,你能告诉我为什么我需要这样做。而且我不使用可以在我的通用 Windows 控制台中成功运行代码的 .c_str() 。

最佳答案

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

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()获取该值并将其转换为字符串,即使它无效。这就是为什么在这种情况下使用它的原因。

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

关于c++ - CMakeList 关于 MySQL Connector c++ 8.0 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59714394/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com