こちらの事象に該当するかわかりませんが、私がC++でMySQLに接続するコードを書いたときは、MySQL関係のインクルードファイルはfull pathで指定するか、プロジェクトの設定っぽいところで追加のライブラリディレクトリを設定しました。
c++でMySQLを使いたいが<mysql_driver.h>が見つからない
環境はwindows11,VSCordです
競プロ経験が少しあるのみでデータベースを触るのは初めてです
MySQLはインストール後動作確認をしました
MySQL Connector C++をインストールし、以下のコードをコピペしてc++ファイルで動かしたところ、
<mysql_driver.h>
が見つからないとのことでした
ご教授願います、、、
#include <iostream>
#include <sstream>
#include <memory>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <mysql_error.h>
#include <cppconn/Statement.h>
#include <cppconn/ResultSet.h>
//define your own configurations in mysql_config.hpp
//for example: HOST = "tcp://127.0.0.1:3306", USER = "root", PASSWORD = "password"
// DATABASE = "database_name"
#include "mysql_config.hpp"
using namespace std;
int main()
{
try {
sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance();
unique_ptr<sql::Connection> con(driver->connect(HOST, USER, PASSWORD));
unique_ptr<sql::Statement> stmt(con->createStatement());
stmt->execute("USE " + DATABASE);
stmt->execute("DROP TABLE IF EXISTS conference");
stmt->execute("CREATE TABLE conference(cid int, name varchar(10))");
cout << "\"conference\" table has been created." << endl;
stmt->execute("INSERT INTO conference VALUES(1, 'SIGMOD')");
stmt->execute("INSERT INTO conference VALUES(2, 'VLDB')");
stmt->execute("INSERT INTO conference VALUES(3, 'ICDE')");
stmt->execute("INSERT INTO conference VALUES(4, 'KDD')");
unique_ptr<sql::ResultSet> res(stmt->executeQuery("SELECT * FROM conference"));
size_t row = 0;
while (res->next()) {
cout << row << "\t";
/* You can use either numeric offsets... */
cout << "cid = " << res->getInt(1);
/* ... or column names for accessing results. The latter is recommended. */
cout << ", name = '" << res->getString("name") << "' " << endl;
row++;
}
} catch (sql::SQLException &e) {
cout << "# ERR: SQLException in " << __FILE__ << " on line " << __LINE__ << endl;
cout << "# ERR: " << e.what() << endl;
cout << " (MySQL error code: " << e.getErrorCode();
cout << ", SQLState: " << e.getSQLState() << " )" << endl;
return EXIT_FAILURE;
} catch (runtime_error &e) {
cout << "# ERR: runtime_error in " << __FILE__ << " on line " << __LINE__ << endl;
cout << "# ERR: " << e.what() << endl;
return EXIT_FAILURE;
}
}
1Answer
Comments
@xxxkousukexxx03
Questionerなるほど、、、
その際mysql_driver.hのファイルも触りました?
探しても見つからないんですよね、、インストーラでしたら、
C:\Program Files\MySQL\Connector C++ 8.0
あたりに、
zipでしたら中を探せばあると思います。他にも、MySQLをインストールされたとのことですので、
C:\Program Files\MySQL\【インストールしたMySQL】\include
C:\Program Files\MySQL\【インストールしたMySQL】\lib
にも、接続に必要な.hや.libが含まれています。
私はこちらを使用しています。コード片を一部コピーして貼り付けておきます。C++と言いつつ書き方がCなのは見逃してください。
//略 //.hや.libを外部参照する場合はconfigを入れるかfull pathにする #include <mysql.h> #pragma comment(lib, "libmysql.lib") #pragma comment(lib, "mysqlclient.lib") int func(){ MYSQL* conn = NULL; MYSQL_RES* resp = NULL; MYSQL_ROW row; char sql_str[255]; char* sql_serv = MYSQL_CLIENT; char* user = MYSQL_USER; char* passwd = MYSQL_PASSWORD; char* db_name = MYSQL_DB; memset(&sql_str[0], 0x00, sizeof(sql_str)); conn = mysql_init(NULL); if (!mysql_real_connect(conn, sql_serv, user, passwd, db_name, 0, NULL, 0)) { return 0; } snprintf(&sql_str[0], sizeof(sql_str) - 1, "select * from xxxx where yyyy = 0 order by id limit 1"); if (mysql_query(conn, &sql_str[0])) { mysql_close(conn); return 0; } resp = mysql_use_result(conn); if ((row = mysql_fetch_row(resp)) != NULL) { printf("%s", row[1]); } mysql_free_result(resp); mysql_close(conn); }
少し調べたのですが、参考にされた情報が少し古いかもしれません。
mysql-connector-c++-8.3.0-winx64
のzip版で動作検証をしました。
zipの中に、includeディレクトリがあります。その中の、mysql/jdbc.hというのに、関連するファイルを全てincludeするコードが確認できると思います。
includeディレクトリを丸ごと、ソースコードと同じ階層にコピーすれば、特別に指定しなければ相対pathで指定できます。
このとき、.libファイルをリンクしないとコンパイルできません。例えばソース内に
#pragma comment(lib, "./mysqlcppconn.lib")
のように書くことができます。mysqlcppconn.libは、
\mysql-connector-c++-8.3.0-winx64\lib64\vs14
の中にありました。これも、絶対pathで入れるのが面倒でしたら、ソースコードと同じところに設置してしまえば一旦は動きます。コンパイル後、実行しようとすると、いろいろdllが無いと言われます。
\mysql-connector-c++-8.3.0-winx64\lib64
の中にあるdllを、コンパイル後の実行ファイルがあるところに置けばOKです。#include <iostream> #include <sstream> #include <memory> //#include <mysql_driver.h> //#include <mysql_connection.h> //#include <mysql_error.h> //#include <cppconn/Statement.h> //#include <cppconn/ResultSet.h> #include "./include/mysql/jdbc.h" #pragma comment(lib, "./mysqlcppconn.lib") //define your own configurations in mysql_config.hpp //for example: HOST = "tcp://127.0.0.1:3306", USER = "root", PASSWORD = "password" // DATABASE = "database_name" //#include "mysql_config.hpp" #define HOST "host" #define USER "user_name" #define PASSWORD "hogehoge" using namespace std; int main() { try { sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance(); unique_ptr<sql::Connection> con(driver->connect(HOST, USER, PASSWORD)); unique_ptr<sql::Statement> stmt(con->createStatement()); stmt->execute("USE database_name"); stmt->execute("DROP TABLE IF EXISTS conference"); stmt->execute("CREATE TABLE conference(cid int, name varchar(10))"); cout << "\"conference\" table has been created." << endl; stmt->execute("INSERT INTO conference VALUES(1, 'SIGMOD')"); stmt->execute("INSERT INTO conference VALUES(2, 'VLDB')"); stmt->execute("INSERT INTO conference VALUES(3, 'ICDE')"); stmt->execute("INSERT INTO conference VALUES(4, 'KDD')"); unique_ptr<sql::ResultSet> res(stmt->executeQuery("SELECT * FROM conference")); size_t row = 0; while (res->next()) { cout << row << "\t"; /* You can use either numeric offsets... */ cout << "cid = " << res->getInt(1); /* ... or column names for accessing results. The latter is recommended. */ cout << ", name = '" << res->getString("name") << "' " << endl; row++; } } catch (sql::SQLException& e) { cout << "# ERR: SQLException in " << __FILE__ << " on line " << __LINE__ << endl; cout << "# ERR: " << e.what() << endl; cout << " (MySQL error code: " << e.getErrorCode(); cout << ", SQLState: " << e.getSQLState() << " )" << endl; return EXIT_FAILURE; } catch (runtime_error& e) { cout << "# ERR: runtime_error in " << __FILE__ << " on line " << __LINE__ << endl; cout << "# ERR: " << e.what() << endl; return EXIT_FAILURE; } }
@xxxkousukexxx03
Questionerなんかうまくいきました!!
怖いので色々調べて勉強してみます笑
ご教授本当にありがとうございました!!!解決したのでしたら、本問をクローズしましょう。