对mysql_init的未定义引用

Ras*_*yrk 11 c c++ linker

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

错误日志是:

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在编译MySQL - 我已经检查过包含路径中是否存在mysql.h.

我错过了什么?

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

#include <iostream>
#include <fstream>
#include <mysql/mysql.h>
Run Code Online (Sandbox Code Playgroud)

编译器不会抱怨缺少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
Run Code Online (Sandbox Code Playgroud)

Makefile文件:

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


test: all
    ./test
Run Code Online (Sandbox Code Playgroud)

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

[解决了]:

将链接库放在编译器命令的末尾可以正常工作.

all:
    g++ main.cpp logger.cpp cpulogger.cpp -o test `mysql_config --cflags --libs`
Run Code Online (Sandbox Code Playgroud)

请参阅以下答案以获得解释

Jon*_*ely 13

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

  • 某些链接器和旧版本的链接器的工作方式可能有所不同,但您不应该依赖它,并且为了可移植性,您应该在依赖它们的对象之后列出库。 (2认同)