【问题标题】:how do I solve libmysqlclient_r.so symbol referencing linking errors?如何解决 libmysqlclient_r.so 符号引用链接错误?
【发布时间】:2012-03-27 09:37:34
【问题描述】:

以下是 make 链接输出。 它显示符号引用错误,即使我提供了 libmysqlclient_r.so 的路径

如果我将它链接到 libmysqlclient.so 那么它工作正常。但由于我的程序使用多线程,我想链接 libmysqlclient_r.so

g++ -L/usr/local/lib -L/lib/64 -L/opt/mysql/mysql/lib -L../../dependencies/glog/lib -L../../dependencies/libevent/lib -L../../dependencies/json/jsoncpp/lib -ljson-gcc-3.4.3_libmt -levent -lglog -lz -lmysqlclient_r -lpthread -lnsl -lumem -lmysys -lmystrings -o ../../dbprocess/bin/dbprocess dbprocess.o sessionlookupcsidrequest.o sessionlookupipv4request.o ../dbframework/connectionpool.o ../dbframework/connectionproxy.o ../dbframework/dbconnection.o  ../framework/rpcmethod.o ../framework/rpcmethoddispatcher.o ../framework/rpcmethodfactory.o ../framework/jsonmethod.o ../framework/libeventmethoddispatcher.o ../framework/tobject.o ../framework/acceptor.o ../framework/configuefile.o ../framework/connmethoddata.o

Undefined                       first referenced
symbol                             in file
mysql_error                         ../dbframework/dbconnection.o
mysql_close                         ../dbframework/dbconnection.o
mysql_stmt_store_result             sessionlookupcsidrequest.o
mysql_stmt_close                    ../dbframework/dbconnection.o
mysql_stmt_fetch                    sessionlookupcsidrequest.o
mysql_stmt_error                    sessionlookupcsidrequest.o
mysql_options                       ../dbframework/dbconnection.o
mysql_stmt_free_result              sessionlookupcsidrequest.o
mysql_stmt_bind_result              sessionlookupcsidrequest.o
mysql_stmt_num_rows                 sessionlookupcsidrequest.o
mysql_stmt_prepare                  ../dbframework/dbconnection.o
mysql_ping                          ../dbframework/dbconnection.o
mysql_init                          ../dbframework/dbconnection.o
mysql_stmt_bind_param               sessionlookupcsidrequest.o
mysql_real_connect                  ../dbframework/dbconnection.o
mysql_stmt_execute                  sessionlookupcsidrequest.o
mysql_stmt_init                     ../dbframework/dbconnection.o
ld: fatal: Symbol referencing errors. No output written to ../../dbprocess/bin/dbprocess
collect2: ld returned 1 exit status
make: *** [../../dbprocess/bin/dbprocess] Error 1

下面是make文件

CPP = g++
LD = $(CPP)
OBJS = dbprocess.o sessionlookupcsidrequest.o sessionlookupipv4request.o ../dbframework/connectionpool.o ../dbframework/connectionproxy.o ../dbframework/dbconnection.o  ../framework/rpcmethod.o ../framework/rpcmethoddispatcher.o ../framework/rpcmethodfactory.o ../framework/jsonmethod.o ../framework/libeventmethoddispatcher.o ../framework/tobject.o ../framework/acceptor.o ../framework/configuefile.o ../framework/connmethoddata.o
CPPFLAGS = -g $(INCFLAGS) -c -Wall -pthreads
LDFLAGS = -L/usr/local/lib -L/lib/64 -L/opt/mysql/mysql/lib/ -L../../dependencies/mysql/lib/solaris -L../../dependencies/glog/lib -L../../dependencies/libevent/lib -L../../dependencies/json/jsoncpp/lib -ljson-gcc-3.4.3_libmt -levent -lglog -lz -lmysqlclient_r -lpthread -lnsl -lumem -lmysys -lmystrings
LIB = ../../dbprocess/bin/dbprocess
INCFLAGS = -I../includes -I/opt/mysql/mysql/include -I../../dependencies/glog/include -I../../dependencies/json/jsoncpp/include -I../../dependencies/libevent/include

all : $(LIB)

$(LIB) : $(OBJS)
$(LD) $(LDFLAGS) -o $(LIB) $(OBJS)

%.o: ../%.cpp
$(CPP) $(CPPFLAGS) $<

clean : 
rm -r -f $(LIB) $(OBJS)

尝试了不同的标志,但仍然没有变化。请推荐

【问题讨论】:

  • 尝试在最后的链接中将LDFLAGS(命名错误)放在OBJS 之后。
  • 你的意思是像 $(LD) -o $(LIB) $(OBJS) $(LDFLAGS)
  • 我已经尝试如上它给出以下错误:ld: warning: file /usr/lib/libmysqlclient_r.a(libmysql.o): wrong ELF class: ELFCLASS64 Undefined first referenced symbol in file same as above ld: fatal: Symbol referencing errors. No output written to ../../dbprocess/bin/dbprocess collect2: ld returned 1 exit status make: *** [../../dbprocess/bin/dbprocess] Error 1
  • 这意味着您正在混合 32 位二进制文​​件和 64 位二进制文​​件。不要那样做。
  • 如果您看到上面的错误 libmysqlclient_r.a(libmysql.o) ,我不想链接到 .a 但 .so 因此我删除了 libmysqlclient_r.a 并再次犯了同样的错误,但与 .so
    ld:致命:文件/opt/mysql/mysql/lib/libmysqlclient_r.so:错误的ELF类:ELFCLASS64 ld:致命:文件处理错误。没有输出写入 ../../dbprocess/bin/dbprocess collect2: ld 返回 1 退出状态 make: *** [../../dbprocess/bin/dbprocess] 错误 1

标签: c++ c mysql-connector libmysql


【解决方案1】:

您的问题可能是您将对象和库传递给ld(或ld 通过g++)的顺序很重要,并且您在依赖它的对象文件之前指定-lmysqlclient_r。您应该尝试将所有-l 参数移动到*.o 之后的行尾,即将您的makefile 步骤更改为

(取两个 - 实际上是来自 cmets 的 Mat 观点:您已将库链接放在 LDFLAGS 变量中)

$(LIB) : $(OBJS)
$(LD) -o $(OBJS) $(LIB) $(LDFLAGS)

【讨论】:

  • 我已尝试进行上述更改。现在我没有收到任何链接错误,例如未定义的符号,而是出现以下错误。
    g++: ../../dbprocess/bin/dbprocess: No such file or directory make: *** [../../dbprocess/bin/dbprocess] 错误1
  • D'oh,对不起,我错过了 Mat 发现的要点 - 您使用 LDFLAGS 来实际链接库,而不是作为通用链接器标志。正如他所建议的那样,最后需要的是 LDFLAGS,而不是 LIB(这是您的输出二进制名称?!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2011-05-25
  • 2011-10-17
  • 1970-01-01
  • 2011-12-07
  • 2019-04-09
相关资源
最近更新 更多