【发布时间】:2011-06-15 01:41:13
【问题描述】:
我已经在 /usr/ 中安装了 SQLite 发行版提供的版本 - 版本 3.4.2。 我已经安装在 /usr/local/ SQLite 版本 3.7.4。
/usr/include/sqlite3.h 定义 SQLITE_VERSION_NUMBER 为 3004002
/usr/local/include/sqlite3.h 定义 SQLITE_VERSION_NUMBER 为 3007004
版本 3007004 有函数 sqlite3_initialize(),版本 3004002 没有。
$ nm -D /usr/local/lib/libsqlite3.so | grep sqlite3_initialize
00018e20 T sqlite3_initialize
当我编译以下示例程序时:
#include <stdio.h>
#include <sqlite3.h>
// This should fail if including /usr/include/sqlite3.h
#if SQLITE_VERSION_NUMBER != 3007004
#error "SQLite version is not 3.7.4"
#endif
int main() {
printf( "%d\n", SQLITE_VERSION_NUMBER );
sqlite3_initialize();
return 0;
}
当像这样编译和链接(使用 gcc 4.2.4)时,预处理器在 /usr/local/include/ 中找到版本 3.7.4 的 sqlite3.h 标头,但链接器在 /usr/lib 中查找时失败/libsqlite3.so 用于符号。
$ gcc -Wall test.c -o cpp -lsqlite3
/tmp/cc4iSSN6.o: In function `main':
test.c:(.text+0x26): undefined reference to `sqlite3_initialize'
test.c:(.text+0x2b): undefined reference to `sqlite3_shutdown'
collect2: ld returned 1 exit status
当然我可以指定lib目录,它会链接正确版本的库。
$ gcc -Wall test.c -o cpp -L/usr/local/lib -lsqlite3
$ ./cpp
3007004
$
默认情况下,gcc 在 /usr/include/ 之前似乎在 /usr/local/include/ 中查找标题,但在链接时不查找库。为什么?
编辑 1:根据 Tim Post 的建议:
$ sudo ldconfig -n /usr/local/lib
$ ldconfig -p | grep sqlite3
libsqlite3.so.0 (libc6) => /usr/local/lib/libsqlite3.so.0
libsqlite3.so.0 (libc6) => /usr/lib/libsqlite3.so.0
libsqlite3.so (libc6) => /usr/local/lib/libsqlite3.so
libsqlite3.so (libc6) => /usr/lib/libsqlite3.so
$ gcc -Wall cpp.c -o cpp -lsqlite3
/tmp/ccwPT9o0.o: In function `main':
cpp.c:(.text+0x26): undefined reference to `sqlite3_initialize'
cpp.c:(.text+0x2b): undefined reference to `sqlite3_shutdown'
collect2: ld returned 1 exit status
【问题讨论】: