TIP 链接错误 link error

环境

  • 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值