C++ CMakeList关于MySQL连接器c++;8.0配置
我不擅长英语, 请原谅我的语法错误。 我想通过cmake在linux/windows中创建一个mysql项目,所以我使用visual studio进行编辑。 我在visual studio中创建了一个cmake项目, 首先,我只在我的项目中测试boost,它已经成功运行了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
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()?我知道这一点(这就是为什么我说“库……需要……”)。我不确定你到底在问什么,但我相信第二部分是你需要关心的。