0

链接步骤为我的所有 mysql 调用获取未定义的引用:

~/private/WDI/git$ make
c++ -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl -o tom tom.o Block.o IPC.o ConnectMxctl.o CI_Metadata.o Log.o
tom.o: In function `connect_to_table_managers()':
/home/chap/private/WDI/git/tom.cpp:128: undefined reference to `mysql_num_rows'
/home/chap/private/WDI/git/tom.cpp:132: undefined reference to `mysql_num_fields'
/home/chap/private/WDI/git/tom.cpp:133: undefined reference to `mysql_fetch_row'
/home/chap/private/WDI/git/tom.cpp:153: undefined reference to `mysql_num_rows'
/home/chap/private/WDI/git/tom.cpp:157: undefined reference to `mysql_fetch_row'
/home/chap/private/WDI/git/tom.cpp:167: undefined reference to `mysql_free_result'

c++ 命令中的链接库由mysql_config --libs. 这是目录的部分列表:

/usr/lib/x86_64-linux-gnu$ ll libmysql*
-rw-r--r-- 1 root root 4838468 Jul 23 23:28 libmysqlclient.a
lrwxrwxrwx 1 root root      16 Jul 23 23:28 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx 1 root root      17 Jul 23 23:28 libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx 1 root root      20 Jul 23 23:28 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx 1 root root      24 Jul 23 23:28 libmysqlclient_r.so.18.0.0 -> libmysqlclient.so.18.0.0
lrwxrwxrwx 1 root root      20 Jul 23 23:28 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx 1 root root      24 Jul 23 23:28 libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
-rw-r--r-- 1 root root 3408144 Jul 23 23:28 libmysqlclient.so.18.0.0

所以事情似乎在适当的地方。为什么这些符号无法解析?

4

1 回答 1

1

您应该将大多数独立库放在命令的末尾,以便编译器可以正确找到符号和定义:

c++ -L/usr/lib/x86_64-linux-gnu -o tom tom.o Block.o IPC.o \
  ConnectMxctl.o CI_Metadata.o Log.o \
  -lmysqlclient -lpthread -lz -lm -lrt -ldl 

通过这样做,编译器将继续从下一个链接文件中搜索未定义的符号。例如,如果IPO.o在 中定义了使用符号(类型/类/结构/函数等) ,编译器可以找到它,CI_Metadata.o因为您将. 大多数库都是独立的,这就是为什么它们位于编译/链接命令的末尾。CI_Metadata.oIPO.o

于 2013-08-03T05:11:51.957 回答