红联Linux门户
Linux帮助

TIP链接错误link error

发布时间:2017-01-30 09:57:57来源:linux网站作者:羽飞
环境
OS:linux 3.13.0
gcc:4.8.2
code:sqlite-3.5.3
 
详细信息
执行的编译命令
gcc -fpic -ftemplate-depth-64 -m64 -DLINUX -DLINUX_X86 -DOPENBOSS -DV20 -DGANSU -D_REENTRANT -D__OPENBOSS_NGMAKE__ -D_THREAD_SAFE -DPTHREADS -
DTHREAD -D_RWSTD_MULTI_THREAD -D_GNU_SOUORCE -I. -lpthread -lrt -ldl alter.o analyze.o attach.o auth.o btmutex.o btree.o build.o callback.
o complete.o date.o delete.o expr.o func.o hash.o insert.o journal.o loadext.o main.o malloc.o mem1.o mem2.o mem3.o mutex.o mutex_os2.o mutex_unix.o
mutex_w32.o opcodes.o os.o os_os2.o os_unix.o os_win.o pager.o parse.o pragma.o prepare.o printf.o random.o select.o table.o tokenize.o trigger.o
update.o util.o vacuum.o vdbe.o vdbeapi.o vdbeaux.o vdbeblob.o vdbefifo.o vdbemem.o where.o utf.o legacy.o vtab.o shell.o -o sqlite3
注意:链接库命令已经加了pthread、rt和dl链接库
 
错误信息
mutex_unix.o: In function `sqlite3_mutex_alloc':
mutex_unix.c:(.text+0x47): undefined reference to `pthread_mutexattr_init'
mutex_unix.c:(.text+0x58): undefined reference to `pthread_mutexattr_settype'
mutex_unix.c:(.text+0x77): undefined reference to `pthread_mutexattr_destroy'
mutex_unix.o: In function `sqlite3_mutex_try':
mutex_unix.c:(.text+0x179): undefined reference to `pthread_mutex_trylock'
os_unix.o: In function `testThreadLockingBehavior':
os_unix.c:(.text+0x124): undefined reference to `pthread_create'
os_unix.c:(.text+0x14b): undefined reference to `pthread_create'
os_unix.c:(.text+0x15c): undefined reference to `pthread_join'
os_unix.c:(.text+0x16d): undefined reference to `pthread_join'
os_unix.o: In function `unixDlOpen':
os_unix.c:(.text+0x1940): undefined reference to `dlopen'
os_unix.o: In function `unixDlError':
os_unix.c:(.text+0x1964): undefined reference to `dlerror'
os_unix.o: In function `unixDlSym':
os_unix.c:(.text+0x19c3): undefined reference to `dlsym'
os_unix.o: In function `unixDlClose':
os_unix.c:(.text+0x19e1): undefined reference to `dlclose'
collect2: error: ld returned 1 exit status
错误信息明显是因为没有添加pthread和dl引起的,这个错误在GCC 4.4.6上编译没有问题,也没有找到原因为什么会出现错误,不过最后还是解决了,最后使用了下面的命令。
 
正确的命令
gcc -fpic -ftemplate-depth-64 -m64 -DLINUX -DLINUX_X86 -DOPENBOSS -DV20 -DGANSU -D_REENTRANT -D__OPENBOSS_NGMAKE__ -D_THREAD_SAFE -DPTHREADS -
DTHREAD -D_RWSTD_MULTI_THREAD -D_GNU_SOUORCE -I. -lrt alter.o analyze.o attach.o auth.o btmutex.o btree.o build.o callback.o complete.o date.o
delete.o expr.o func.o hash.o insert.o journal.o loadext.o main.o malloc.o mem1.o mem2.o mem3.o mutex.o mutex_os2.o mutex_unix.o mutex_w32.o opcodes.
o os.o os_os2.o os_unix.o os_win.o pager.o parse.o pragma.o prepare.o printf.o random.o select.o table.o tokenize.o trigger.o update.o util.o vacuum.
o vdbe.o vdbeapi.o vdbeaux.o vdbeblob.o vdbefifo.o vdbemem.o where.o utf.o legacy.o vtab.o shell.o -o sqlite3 -lpthread -ldl
与前面不同的就是把pthread和dl放到了后面而已。
GCC从4.4升级到4.8后还遇到一些链接库递归依赖的问题。
比如:
A 依赖 B和C
B 依赖 C
在4.4版本的GCC中,A的Makefile中只需要指定A依赖B就可以了,但是4.8要明确指出A依赖B和C。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/28044.html