2012-03-27 94 views
0

以下是make的链接输出。 它显示符号引用错误,即使我已经提供了libmysqlclient_r.so的路径我该如何解决引用链接错误的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) 

标志不同,但仍然没有改变尝试。请建议

+0

尝试在最终链接中放入'OBJS'后面的'LDFLAGS'(错误名称)。 – Mat 2012-03-27 09:40:23

+0

你的意思是 $(LD)-o $(LIB)$(OBJS)$(LDFLAGS) – user1145280 2012-03-27 10:04:41

+0

是的,试试看。 – Mat 2012-03-27 10:05:23

回答

0

你的问题可能是你(通过g++ld)传递对象和库ld的顺序是显著和你指定-lmysqlclient_r依赖于它的目标文件之前。你应该尝试*.o,即在所有-l参数移动到行的末尾改变你的makefile步骤

(采取两种 - 实际上垫的点从评论:您已经把在LDFLAGS变量库链接)

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

我已经尝试过使用上述更改。现在我没有像Undefined symbol这样的链接错误,但是出现错误。
g ++:../../dbprocess/bin/dbprocess:没有这样的文件或目录 make:*** [../ ../ dbprocess/bin/dbprocess]错误1 – user1145280 2012-03-28 08:21:24

+0

D'oh,对不起,我错过了Mat发现的一点 - 您正在使用LDFLAGS实际链接库,而不是实际上作为通用链接器标记。它是LDFLAGS,需要按照他的建议去最后一次,而不是LIB(这是你的输出二进制名称?!)。 – Rup 2012-03-28 10:04:23