2007年6月7日星期四

/usr/bin/ld: cannot find -l

使用Linux中的g++处理一个在Windows下的Cygwin的g++可以成功处理的Makefile时,出现了链接库的错误:

g++ a.o -L. -lsqlite3 -o exename
/usr/bin/ld: cannot find -lsqlite3
collect2: ld returned 1 exit status
make: *** [exename] Error 1
这是一个编译时候的路径错误,我把从SQLite官方网站上下载的sqlite3.so放在了Makefile的同目录下。
在 Linux下,默认的链接库的名字为 libsqlite3.so所以我把库名改了。
这时出现如下的错误:
./libsqlite3.so: undefined reference to 'pthread_create'
./libsqlite3.so: undefined reference to 'pthread_getspecific'
./libsqlite3.so: undefined reference to 'dlclose'
./libsqlite3.so: undefined reference to 'pthread_key_create'
./libsqlite3.so: undefined reference to 'dlopen'
./libsqlite3.so: undefined reference to 'dlsym'
./libsqlite3.so: undefined reference to 'pthread_join'
./libsqlite3.so: undefined reference to 'pthread_setspecific'
从SQLite官方网站上下载的这个预编译过的so链接库需要同时链接 libpthread.so
所以命令改为
g++ a.o -lpthread -L. -lsqlite3 -o exename
, 只剩下 dl开头的一些错误。
所以在命令中添加链接库 libdl.so的命令,最后的命令如下
g++ a.o -lpthread -ldl -L. -lsqlite3 -o exename


现在编译链接没有错误了,可以成功生成 exename可执行文件,但可执行文件却有新的错误:
./exename: error while loading shared libraries: libsqlite3.so: cannot open shared object file: No such file or directory.


也就是说,还要把libsqlite3.so这个文件拷贝到/usr/lib中,这个程序才可用。

没有评论: