【问题标题】:Undefined reference to `mysql_init'未定义的对 `mysql_init' 的引用
【发布时间】:2012-06-13 18:47:03
【问题描述】:

我正在尝试在我的新服务器上编译我的程序,但目前它不适合我。

错误日志是:

rasmus@web01:~/c++$ make test
g++ `mysql_config --cflags --libs` main.cpp logger.cpp cpulogger.cpp -o test
/tmp/ccPaMZUy.o: In function `CPULogger':
/home/rasmus/c++/cpulogger.cpp:7: undefined reference to `mysql_init'
/home/rasmus/c++/cpulogger.cpp:8: undefined reference to `mysql_real_connect'
/home/rasmus/c++/cpulogger.cpp:10: undefined reference to `mysql_get_client_info'
/tmp/ccPaMZUy.o: In function `~CPULogger':
/home/rasmus/c++/cpulogger.cpp:16: undefined reference to `mysql_close'
collect2: ld returned 1 exit status
make: *** [all] Error 1

如您所见,我正在针对 MySQL 进行编译 - 我已检查 mysql.h 是否存在于包含路径中。

我错过了什么?

cpulogger.cpp 在顶部有 #include "cpulogger.h",然后 cpulogger.h 有这个:

#include <iostream>
#include <fstream>
#include <mysql/mysql.h>

编译器不会抱怨缺少mysql/mysql.h,所以那部分一定可以工作吗?

mysql_config 的输出:

rasmus@web01:~/c++$ mysql_config --cflags --libs
-I/usr/include/mysql -DBIG_JOINS=1  -fno-strict-aliasing  -g
-L/usr/lib -lmysqlclient -lpthread -lz -lm -lrt -ldl

生成文件:

all:
    g++ `mysql_config --cflags --libs` main.cpp logger.cpp cpulogger.cpp -o test


test: all
    ./test

这是一个全新的 Ubuntu 服务器安装,上面安装了 mysql-server。

[已解决]:

将链接器库放在编译器命令的末尾是可行的。

all:
    g++ main.cpp logger.cpp cpulogger.cpp -o test `mysql_config --cflags --libs`

请参阅下面的答案以获得解释。

【问题讨论】:

  • mysql 是否也需要链接库?
  • 你检查过“mysql_config --cflags --libs”的输出吗?
  • cpulogger.cpp 中的代码是什么——尤其是#include
  • 看起来您在这里缺少指向图书馆的链接。检查你的makefile
  • 尝试将库放在命令末尾(文件之后)

标签: c++ c linker


【解决方案1】:

链接器的参数顺序很重要。在列出需要它的文件之后使用 mysql-config 。链接器将看到 cpulogger.o 需要 mysql_init 并在其后列出的库中查找符号。如果这些库在参数中较早列出,则不会再次搜索它们。

【讨论】:

  • 那行得通。新的 makefile:g++ main.cpp logger.cpp cpulogger.cpp -o test mysql_config --cflags --libs 但为什么它可以在其他服务器上工作?
  • 某些链接器和旧版本的链接器的工作方式可能不同,但您不应依赖它,并且为了可移植性,您应该在依赖它们的对象之后列出库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2022-01-22
  • 2016-04-04
  • 2015-11-03
相关资源
最近更新 更多