SQLite3 в cygwin вызывает ошибки компоновщика - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь запустить простую программу sqlite3 «здравствуй, мир» в cygwin.Первоначально я установил его из setup.exe, но когда я запустил программу, я получил ошибки компоновщика, такие как «неопределенная ссылка на` _sqlite3_open '».Я AM с помощью ключа -lsqlite3 при компиляции.

Расположение здесь:

$ ls /usr/lib/ | grep sql
libsqlite3.a
libsqlite3.dll.a
libsqlite3.la

Затем я попытался загрузить исходный текст sqlite3 и скомпилировать его вручную, но яполучить те же ошибки.Он установлен в / usr / local / lib

$ ls /usr/local/lib/ | grep sql
libsqlite3.a
libsqlite3.dll.a
libsqlite3.la

Я все еще получаю эти ошибки компоновщика, и не могу понять, как это исправить?

$ gcc -lsqlite3 test.cc
test.cc: In function ‘int main()’:
test.cc:41: warning: deprecated conversion from string constant to ‘char*’
/tmp/ccKA3ZFa.o:test.cc:(.text+0x2d): undefined reference to `_sqlite3_open'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x41): undefined reference to `_sqlite3_errmsg'
/tmp/ccKA3ZFa.o:test.cc:(.text+0xb6): undefined reference to `_sqlite3_prepare_v2'
/tmp/ccKA3ZFa.o:test.cc:(.text+0xca): undefined reference to `_sqlite3_errmsg'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x10e): undefined reference to `_sqlite3_step'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x12a): undefined reference to `_sqlite3_column_bytes'
/tmp/ccKA3ZFa.o:test.cc:(.text+0x140): undefined reference to `_sqlite3_column_text'
/tmp/ccKA3ZFa.o:test.cc:(.eh_frame+0x11): undefined reference to `___gxx_personality_v0'
collect2: ld returned 1 exit status

Спасибо за любую помощь, которую вы можете предоставить.Приветствия:)

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

Это размещение опции -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 и не обращали на нее внимания, они никогда не будут решены.Отсюда твоя ошибка.

1 голос
/ 20 апреля 2011

Вероятно, вам нужна ваша библиотека в конце команды:

gcc test.cc -lsqlite3

Компоновщик обычно ищет символы слева направо, а на символы SQLite ссылаются в test.cc, но они определены вlibsqlite3.a.

...