私は、SQLiteのバージョン3.4.2を提供する/ usr/distributionにインストールしました。 私は/ usr/local/SQLiteバージョン3.7.4にインストールしました。 3004002
/usr/local/include/sqlite3.hは3007004GCCは、コンパイル時に/ usr/local/includeのヘッダーを探しますが、リンク時に/ usr/local/libのライブラリは探しません。どうして?
版3007004としてSQLITE_VERSION_NUMBERを定義するよう
/usr/include/sqlite3.hはSQLITE_VERSION_NUMBERを定義バージョン3004002にはない、()関数sqlite3_initializeを有しています。
$ nm -D /usr/local/lib/libsqlite3.so | grep sqlite3_initialize
00018e20 T sqlite3_initialize
Iは、次の例のプログラムのコンパイル時:
#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で)コンパイルおよびリンクする場合、プリプロセッサは、バージョン3.7.4用sqlite3.hヘッダを発見/ usr/local/include /にありますが、リンカはシンボルの/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
$
リンク時には/ usr /含める/ヘッダのではなく、ライブラリのための/は/ usr/localには/の前に含ま見えるデフォルトのgccでいるようです。どうして?
編集1:ティム・ポストによって示唆されるように:
$ 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
ライブラリパスは 'ld'にコード化されているだけでなく、' ld'コマンドラインで 'gcc'によって明示的に指定されています(' ld'にもコード化されています)。単に 'strace'を使って見てください。 –