【发布时间】:2021-05-18 11:52:18
【问题描述】:
我在这里看到了几个类似问题的帖子并尝试了许多建议,但我仍然没有找到解决问题的方法。 我在工作中使用了一些 cpp 代码,我必须根据自己的需要稍作更改。他们有自己的具有相同结构的makefile。这些文件使用相同的库列表,虽然我可以编译其中一些,但对于其他文件,编译不成功。具体来说,我收到以下错误:
/usr/bin/ld: fill_worldqual_load.o: undefined reference to symbol 'mysql_free_result@@libmysqlclient_18'//usr/lib64/mysql/libmysqlclient.so.18: error adding symbols: DSO missing from command line
makefile 是这样的:
CC = g++ -Wall -Wno-unused-but-set-variable
MAKE = make -f makefile
APPNAME = fill_worldqual_load
OBJECTS = fill_worldqual_load.o ../general_function/timestring.o \
../general_function/country.o \
../general_function/general_functions.o \
../options/options.o options_fill_wq_load.o
CCOPTS = -c
OPTIMIZE = -O3
INCDIROPTS = -L/usr/local/lib/libmysqlpp.so -I/usr/include/mysql -L/usr/lib64/mysql/libmysqlclient.so -I/usr/local/include/mysql++ -I../general_function -I../options
LNKLIB = -lmysqlpp
$(APPNAME): $(OBJECTS)
$(CC) $(INCDIROPTS) $(LNKOPTS) -o $(APPNAME) $(OBJECTS) $(LNKLIB)
.cpp.o:
$(CC) -c $(INCDIROPTS) $(DEBUG) -o $*.o $*.cpp
all: clean
@$(MAKE) $(APPNAME)
echo all: make complete
我已经成功编译了具有相同库列表和相同 makefile 结构的类似代码。在为其中一个程序调用 ldd 后,我得到:
libmysqlpp.so.3 => /usr/local/lib/libmysqlpp.so.3
libstdc++.so.6 => /usr/lib64/libstdc++.so.6
libm.so.6 => /usr/lib64/libm.so.6
libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1
libc.so.6 => /usr/lib64/libc.so.6
libmysqlclient.so.18 => //usr/lib64/mysql/libmysqlclient.so.18
/lib64/ld-linux-x86-64.so.2 (0x00002aaffda12000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00002aaffef79000)
libz.so.1 => /usr/lib64/libz.so.1 (0x00002aafff195000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00002aafff3ab000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00002aafff61d000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00002aafffa7f000)
libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00002aafffc83000)
libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00002aafffed0000)
libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00002ab0001b9000)
libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00002ab0003bd000)
libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00002ab0005f0000)
libkeyutils.so.1 => /usr/lib64/libkeyutils.so.1 (0x00002ab000800000)
libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00002ab000a04000)
libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00002ab000c1d000)
libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00002ab000e44000)
如果我理解得很好,这个程序成功链接了 libmysqlclient.so.18,但我首先提到的程序没有。我不明白为什么。我真的很感激任何提示!
【问题讨论】:
-
您可能缺少链接器标志。尝试将
-lmysqlclient添加到LINKLIB。 Herearesomehelpful(?)links. -
谢谢尼克!如果我将该标志放在 LINKLIB 中,那么我得到: /usr/bin/ld: cannot find -lmysqlclient .... 但其他代码也需要 mysqlclient 并且它们编译没有问题
-
也许是
-L/usr/lib64/mysql?你的INCDIROPTS是错误的。您应该使用-L指定可以找到库的目录,并使用-l指定实际的库名称 -
感谢 Ted .. 它解决了问题 :) ... 我只是想知道为什么其他代码也需要 mysqlclient .. 再次感谢您的帮助!
-
@user286686 很高兴它成功了。很难说其他项目为何奏效。也许其他东西使它与这些库链接。
标签: c++ compilation missing-symbols