【问题标题】:DSO missing from command line when compiling编译时命令行中缺少 DSO
【发布时间】: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 添加到LINKLIBHerearesomehelpful(?)links.
  • 谢谢尼克!如果我将该标志放在 LINKLIB 中,那么我得到: /usr/bin/ld: cannot find -lmysqlclient .... 但其他代码也需要 mysqlclient 并且它们编译没有问题
  • 也许是-L/usr/lib64/mysql?你的INCDIROPTS 是错误的。您应该使用-L 指定可以找到库的目录,并使用-l 指定实际的库名称
  • 感谢 Ted .. 它解决了问题 :) ... 我只是想知道为什么其他代码也需要 mysqlclient .. 再次感谢您的帮助!
  • @user286686 很高兴它成功了。很难说其他项目为何奏效。也许其他东西使它与这些库链接。

标签: c++ compilation missing-symbols


【解决方案1】:

INCDIROPTS 字段不正确。在 Makefiles 中,library locations are specified with -L and the actual library names are linked with -l.

INCDIROPTS中用-L/usr/lib64/mysql指定mysql库,然后在LNKLIB中用-lmysqlclient链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2019-01-12
    • 2016-11-17
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多