【问题标题】:c++ and MySQL connectionc++和MySQL连接
【发布时间】:2015-08-07 10:25:49
【问题描述】:

我对 c++ 完全陌生,到目前为止我还没有做过那么多。 现在,我需要设置一个到 mysql-server 的 DB 连接,以检索一些数据。

所以我发现了这个问题MySQL C++ Connector getting a string with SELECT query。我尝试按照问题中的说明设置所有内容,但最终出现了几个错误。

我的代码:

// important part for the mysql-stuff
#include <mysql/mysql.h>


// Basic setup for the DB
static char const *opt_host_name = "localhost"; /* HOST */
static char const *opt_user_name = "root"; /* USERNAME */
static char const *opt_password = "mypass"; /* PASSWORD */
static unsigned int opt_port_num = 3306; /* PORT */
static char const *opt_socket_name = NULL; /* SOCKET NAME, DO NOT CHANGE */
static char const *opt_db_name = "mydb"; /* DATABASE NAME */
static unsigned int opt_flags = 0; /* CONNECTION FLAGS, DO NOT CHANGE */

这是我试图获得输出的方法:

int main(void) {
    try {

        // setup the connection
        MYSQL *conn; /* pointer to connection handler */
        MYSQL_RES *res; /* holds the result set */
        MYSQL_ROW row;

        /* INITIALIZE CONNECTION HANDLER, DO NOT CHANGE */
        conn = mysql_init(NULL);

        /* THIS CONNECTS TO SERVER, DO NOT CHANGE ANYTHING HERE */
        mysql_real_connect(conn, opt_host_name, opt_user_name, opt_password,
            opt_db_name, opt_port_num, opt_socket_name, opt_flags);

        /* show tables in the database (test for errors also) */
        mysql_query(conn, "SELECT * FROM plates");
        res = mysql_store_result(conn);

        // get the number of the columns
        int num_fields = mysql_num_fields(res);

        while ((row = mysql_fetch_row(res))) {
            // Print all columns
            for (int i = 0; i < num_fields; i++) {
                // Make sure row[i] is valid!

                cout << row[i];
            }
        }
    }
}

在文件所在的特定文件夹中调用make后,它会打印:

对 mysql_init 的未定义引用

对 mysql_real_connect 的未定义引用

...以及该代码中列出的每个函数。

这里是Makefile

SAMPLES = cpd01.out

.PHONY: all
all: $(SAMPLES)

.PHONY: clean
clean:
    rm -f $(SAMPLES)

%.out : %.cpp
    g++ -g3 -o $@ $< -DLINUX -I/usr/include/gx -ldl -DGX_NAMESPACES

我没有制作那个 Makefile,如上所述,我不知道 PHONY(或其他)代表什么。我猜得再深入一点。

如果我理解 PaulMcKenzie 的正确性,我必须在这里添加一些内容,对吗?

【问题讨论】:

  • 这些是链接器错误,与您在发布的 URL 中引用的信息无关。在构建过程的某个地方,您需要告诉链接器这些函数的位置。您很可能忘记(或未正确设置)您的make 或构建过程以在链接时包含 mysql 库。
  • @PaulMcKenzie 我编辑了这个问题。那讲得通。最后一行的位置和内容是什么?
  • -l 选项正是您所寻找的。您需要告诉链接器这些函数所在的库的名称。你已经有了-ldl——你需要另一个-lxxx来指定mysql对象库。 gcc.gnu.org/onlinedocs/gcc/Link-Options.html

标签: c++ mysql


【解决方案1】:

MySQL 附带一个可以运行的脚本,告诉您要链接到哪些库:mysql_config --libs

在我的系统上它给出:

$ mysql_config --libs
-L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -lssl -lcrypto -ldl

您需要将这些标志添加到链接命令(或编译器命令,如果您同时链接所有)。

如果您使用GNU Make,您应该可以这样做:

SAMPLES = cpd01.out

MYSQL_LIBS = $(shell mysql_config --libs)

.PHONY: all
all: $(SAMPLES)

.PHONY: clean
clean:
    rm -f $(SAMPLES)

%.out : %.cpp
    g++ -g3 -o $@ $< -DLINUX -I/usr/include/gx -ldl -DGX_NAMESPACES $(MYSQL_LIBS)

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2016-10-08
    • 2013-12-10
    相关资源
    最近更新 更多