Это размещение опции -l
, которое вызывает вашу проблему.Попробуйте выполнить это вместо этого:
gcc test.cc -lsqlite3
Согласно следующей расшифровке:
pax$ cat qq.c
#include <sqlite3.h>
int main (void) {
sqlite3 *x;
sqlite3_open("db", &x);
return 0;
}
pax$ gcc -L/usr/lib -lsqlite3 -o qq qq.c
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccmgVbDt.o:
qq.c:(.text+0x25): undefined reference to `_sqlite3_open'
collect2: ld returned 1 exit status
pax$ gcc -L/usr/lib -o qq qq.c -lsqlite3
pax$ _
Вы можете видеть это, когда -l
следует другим аргументам,нет ошибки компоновщика.
Соответствующий бит со страницы руководства (под описанием -l
):
Разница в том, где в команде вы пишете этовариант;компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке.Таким образом, foo.o -lz bar.o
ищет библиотеку z
после файла foo.o
, но до bar.o
.Если bar.o
относится к функциям в z
, эти функции могут не загружаться.
Другими словами, в точке, где вы указываете -lsqlite3
, есть нет неразрешенные ссылки на любые функции SQLite, поэтому ни одна из них не загружена.
Позже, когда вы загружаете test.o
, имеет неразрешенные ссылки.К сожалению, так как вы уже посмотрели библиотеку SQLite3 и не обращали на нее внимания, они никогда не будут решены.Отсюда твоя ошибка.