【发布时间】: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