TIP 链接错误 link error

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。

你可能感兴趣的:(linux,gcc)