Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Ошибка компиляции при использовании sqlite3  (Прочитано 1975 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Красноглазый

  • Автор темы
  • Активист
  • *
  • Сообщений: 705
    • Просмотр профиля
Пытаюсь написать простенькую программу с использованием движка sqlite. В ubuntu 9.10 доставил sqlite3 и libsqlite3-dev.
Чтобы было удобней отлаживаться, установил netbeans 6.8 с поддержкой c/c++. Создаю новый проект, набираю текст из справки по sqlite, компилю и получаю ошибку типа:

/home/denis/NetBeansProjects/mylib/main.cpp:21: undefined reference to `sqlite3_open'

Судя по всему, компилятор нашел sqlite3.h, но не может найти sqlite3.c с собственно функциями sqlite3_xxxx().
Может кто подскажет, где искать в стандартных пакетах ubuntu недостающие файлы.
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

/*
 *
 */
int main(int argc, char** argv)
{
    sqlite3 *db = NULL;
    int rc;
    char dbfn[] = "_MyLib.db";

    rc = sqlite3_open(dbfn, &db);
    if(rc){
        fprintf(stderr, "Can't open database: %s\n", dbfn);
        return(EXIT_FAILURE);
    }
   
   
    sqlite3_close(db);
    return (EXIT_SUCCESS);
}

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
Re: Ошибка компиляции при использовании sqlite3
« Ответ #1 : 02 Январь 2010, 18:33:44 »
Надо линковать со статической библиотекой sqlite3. Поэтому ее надо добавить в свойствах проекта Netbeans.
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн Красноглазый

  • Автор темы
  • Активист
  • *
  • Сообщений: 705
    • Просмотр профиля
Re: Ошибка компиляции при использовании sqlite3
« Ответ #2 : 02 Январь 2010, 19:20:48 »
Спасибо! Получилось! Добавил к проекту libsqlite3.a и все заработало.
А для релиза, я так понимаю, лучше подключать динамическую библиотеку?

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
Re: Ошибка компиляции при использовании sqlite3
« Ответ #3 : 02 Январь 2010, 21:12:15 »
Хехъ.

Здесь мы читаем о том, что такое статическая и что такое динамическая библиотека.

По поводу релизной и отладочной версии. Смотрите, что значит опция g для gcc. Потом посмотрите документацию по утилите strip.
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн Красноглазый

  • Автор темы
  • Активист
  • *
  • Сообщений: 705
    • Просмотр профиля
Re: Ошибка компиляции при использовании sqlite3
« Ответ #4 : 02 Январь 2010, 23:09:57 »
Отдельное спасибо за ссылочку! Хотя как-то так я себе все это и представлял.
В вопросе я имел ввиду, что sqlite используется в куче стандартных программ и наверняка в виде динамической библиотеки (по сорсам не лазил, но что-то подсказывает...).
Соответственно для релиза имеет смысл использовать именно такой вариант, а для отладки проще использовать статически залинкованный модуль, чтобы не лезть отладчиком в системные каталоги.
Или есть возможность трассировки кода и внутри системных динамических библиотек?

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
Re: Ошибка компиляции при использовании sqlite3
« Ответ #5 : 03 Январь 2010, 01:04:11 »
Если я правильно помню, то при использовании динамических библиотек необходимо будет описывать кучу указателей на функции с соответствующими сигнатурами. Хз на сколько это удобно. Если я не прав, то пусть меня поправят. Насчет трасировки ничего сказать не могу.
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн Красноглазый

  • Автор темы
  • Активист
  • *
  • Сообщений: 705
    • Просмотр профиля
Re: Ошибка компиляции при использовании sqlite3
« Ответ #6 : 03 Январь 2010, 10:49:31 »
Насколько я понял прочитанное, статические библиотеки - это аналоги lib в виндах, а динамические - dll. Соответствено динамические библиотеки можно линковать напрямую и указатели на функции находит линковщик. В этом случае программа привязывается к определенной версии библиотеки. Или же можно динамически загружать такую библиотеку во время выполнения и указатели на функции находить по их названиям самому в процессе выполнения.

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
Re: Ошибка компиляции при использовании sqlite3
« Ответ #7 : 03 Январь 2010, 15:13:37 »
Да, все так. Единственный минус - вам придется описать указатели на функции в соответствии с их сигнатурами, чтобы получить их из динамической библиотеки. Например:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <sqlite.h>

typedef int (sqlite3_open_fnc*)(const char* filename, sqlite3** ppDb);

int main(int argc, char* argv[]) {
    void* dlhandle = NULL;
    sqlite3_open_fnc open_fn;
    sqlite3* dbhandle;

    dlhandle = dlopen("/usr/lib/libsqlite.so", RTLD_LAZY);
    open_fn = (sqlite3_open_fnc)dlsym(dlhandle, "sqlite3_open");
    open_fn("myfile.db", &dbhandle);

    return 0;
}

Где-то так. Но здесь нет проверок возвращаемых результатов, не закрывается БД. Это чтобы смысл был понятен.
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

 

Страница сгенерирована за 0.054 секунд. Запросов: 24.