Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Платформы Windows Mobile и Windows Embedded > Использование SQLite


Автор: Brodyaga 22.12.2008, 20:44
Всем доброго времени суток! Решил использовать в качестве БД для телефона SQLite... Но под WinCE никак скомпилить не могу... Исходники качал http://sourceforge.net/project/showfiles.php?group_id=88393. При компиляции выдаёт ошибки типа...:
Код

Error    65    error C2065: 'FILENAME_MAX' : undeclared identifier
Error    66    error C2057: expected constant expression
Error    67    error C2229: struct 'callback_data' has an illegal zero-sized array
Error    72    fatal error C1083: Cannot open include file: 'tcl.h': No such file or directory


Не понимаю.. как эти исходники под Win CE, если даже константу FILENAME_MAX он найти не может?! (в Win32 она определена в stdio.h)

Так же нашёл в инете http://mobile-developer.ru/database/rabota-s-bazami-dannyh-sobiraem-sqlite-dlya-windows-mobile/.. и по ней тоже пробовал.. Скомпилилось вроде всё норм, но при подключению полученной lib'ы к проекту и вызове функций также сыплюца ошибки о том, что не определенна какаято переменная, нашёл в исходниках с помощью каких макросов она создаёца, но вот в мкрос надо передать значению её.. а где его взять?! вообщем уже совсем запутался.. Помогите пожалуйста! ОЧЕНЬ НАДО! :(

Автор: Alexeis 22.12.2008, 20:57
Brodyaga, насколько я помню для компиляции исходников под CE нужен gcc или еще какой-то гнутый компилятор. Там часть сорцов генериться на лету при помощи make файла. Но у них есть еще скрытые сорцы уже готовые. Я качал такой пак и компилировал его в Билдере. Получилась вполне рабочая Dll ина. Для CE есть нюансы. Функция CreateFile работает не с файлом во флеше, а с его образом в ОЗУ, т.о. в памяти будет висеть вся база, а сам движок ничуть не ответственен за то чтобы сохранять базу во флеш. Потому ИМХО, нужно переписать файловый интерфейс под работу с конкретной флеш памятью. Для этого нужно передать в конфигурационную функцию структуру с указателями на функции для работы с файлами. После этого перекомпилировать. Сейчас под рукой нет исходников, на работе остались.

Автор: Brodyaga 22.12.2008, 21:09
Спасибо за ответ! Завтра скинуть сможете??? На работе посмотрю, поковыряю!

Автор: t_rex 23.12.2008, 14:18
Цитата

Скомпилилось вроде всё норм, но при подключению полученной lib'ы к проекту и вызове функций также сыплюца ошибки о том, что не определенна какаято переменная, нашёл в исходниках с помощью каких макросов она создаёца, но вот в мкрос надо передать значению её.. а где его взять?!

Ты б хоть build log выложил, а то телепаты в отпуске, а мы тут без них хз что там за проблема.

Автор: Alexeis 23.12.2008, 14:31
Цитата(Brodyaga @  22.12.2008,  20:09 Найти цитируемый пост)
Завтра скинуть сможете??? На работе посмотрю, поковыряю! 

    Значит ссылка такая 
http://www.sqlite.org/sqlite-source-3_6_7.zip

На момент скачки версия может измениться, но архив продолжают заливать, потому если файл не найден попробуйте другое имя в формате
http://www.sqlite.org/sqlite-source-x_y_z.zip

т.е. 3.67 -> 3_6_7 . 4я цифра в имени архива не участвует.

Добавлено через 5 минут и 15 секунд
  Если, в последствии будет желание открыть эту базу на PC, то удобно использовать odbc драйвер.
Например при помощи него в билдере можно приконектиться к базе используя ADO.
http://www.ch-werner.de/sqliteodbc/sqliteodbc.exe (http://www.ch-werner.de/sqliteodbc/)

Добавлено через 9 минут и 46 секунд
Хотя не, на счет того что скрыта ссылка пожалуй я не прав, нашел таки ее на http://www.sqlite.org/download.html

Последняя ссылка в разделе "Source Code" 

Автор: Brodyaga 23.12.2008, 15:57
Цитата

    Значит ссылка такая 
http://www.sqlite.org/sqlite-source-3_6_7.zip


Дык для Win CE же в другом месте лежит... http://sqlite-wince.sourceforge.net/ или я ошибаюсь и надо всётаки брать то, что вы указали??

Автор: Alexeis 23.12.2008, 17:00
Цитата(Brodyaga @  23.12.2008,  14:57 Найти цитируемый пост)
Дык для Win CE же в другом месте лежит... тута 

  Не знаю даже, они какие-то урезанные и не очень свежие "sqlite-wince-3.3.5". 

Мне кажется если адаптировать, то лучше самые свежие.

Автор: Brodyaga 23.12.2008, 22:02
t_rex,
Цитата

Ты б хоть build log выложил, а то телепаты в отпуске, а мы тут без них хз что там за проблема.


Извините.. я думал они вернулись из отпуска.. ну да ладно, ошибки вот такого плана
Код

Error    1    error C2065: 'sqlite3_api' : undeclared identifier
Error    2    error C2227: left of '->open' must point to class/struct/union/generic typec


Это так он ругаеца на вызов функции sqlite3_open.. Заходим в исходный файл и видим, что эта фунция не что иное как...
Код

#define sqlite3_open                   sqlite3_api->open


А вот те самые макросы из исходников, которые создают эту переменную:
Код

#define SQLITE_EXTENSION_INIT1     const sqlite3_api_routines *sqlite3_api = 0;
#define SQLITE_EXTENSION_INIT2(v)  sqlite3_api = v;


А вот где взять это загадочное v... вот в чём вопрос... Напоминаю, это способ представленный в http://mobile-developer.ru/database/rabota-s-bazami-dannyh-sobiraem-sqlite-dlya-windows-mobile/ статье. Потому что в сущности то мне под Win Mobile нужно.


Автор: Alexeis 23.12.2008, 22:33
Brodyaga, думаю дело в том что не определены некоторые дефайны, от того у компилятора проблемы с именами.

Автор: t_rex 24.12.2008, 00:30
Да, здесь, похоже, проблема именно в директивах компилятора. Думаю, проще всего было бы открыть исходник SQLite Amalgamation в Visual Studio и посмотреть почему этот код не включается в сборку, там должны быть условия в коде вида или #ifdef _SOME_MACRO или #if defined(_SOME_MACRO) и опытным путем определить какие из них нужно подобавлять в C/C++ -> Preprocessor

Автор: Brodyaga 24.12.2008, 08:54
Цитата

Brodyaga, думаю дело в том что не определены некоторые дефайны, от того у компилятора проблемы с именами.


Цитата

Да, здесь, похоже, проблема именно в директивах компилятора. Думаю, проще всего было бы открыть исходник SQLite Amalgamation в Visual Studio и посмотреть почему этот код не включается в сборку, там должны быть условия в коде вида или #ifdef _SOME_MACRO или #if defined(_SOME_MACRO) и опытным путем определить какие из них нужно подобавлять в C/C++ -> Preprocessor


Есть в коде условия такого вида!

Код

#ifndef SQLITE_CORE
...
#define sqlite3_open                   sqlite3_api->open
...
#endif /* SQLITE_CORE */


Но не в этом суть... причом тут дефайны это же макросы которые нужно вызывать самому... Например если я в коде вызываю макрос
Код

SQLITE_EXTENSION_INIT1;

,то описанные ошибки пропадают... но при обращениям к функциям выскакивают другие так как этот макрос лишь инициализирует переменную sqlite3_api присваивая ей 0, а не реальное значение... Реальное же значение передаётся макросу 
Код

SQLITE_EXTENSION_INIT2(v);

Но вот где его взять(реальное значение в смысле)?!? Если бы я смог инициализировать переменную sqlite3_api, то и дефайны типа...
Код

#define sqlite3_open                   sqlite3_api->open

заработали бы...

Но вот как это сделать...???

Автор: Alexeis 24.12.2008, 11:46
Цитата(Brodyaga @  24.12.2008,  07:54 Найти цитируемый пост)
Но не в этом суть... причом тут дефайны это же макросы которые нужно вызывать самому... Например если я в коде вызываю макрос

  Не всегда, есть дефайны условной компиляции, которые определяют какой код будет компилироваться, а какой нет. Функция с одним т  тем же именем и параметрами может иметь несколько реализаций, зависящих от возможности ОС. Например если нет возможности синхронизировать доступ к файлу на диске, то часть кода ответственную за этот механизм можно исключить из проекта. В проекте SQLLite есть набор фич, которые можно исключить из работы и тем самым упростить движок. 
  Если не компиляться те исходники советую взять полные, те что я указал. У меня они скомпилировались правильно, может и у вас заработают без ошибок. В них тоже есть директивы специально для CE. И из них можно скомпилировать версию для CE.

Автор: Brodyaga 24.12.2008, 13:07
В тех исходниках, что лежат на официальном сайте компилятор не может найти tcl.h и io.h. Первый я нашёл в инете, а второй для WinCE хз где... ПОделитесь если есть? И что вы из этих исходников делали? lib или dll ?

Автор: Alexeis 24.12.2008, 14:03
Цитата(Brodyaga @  24.12.2008,  12:07 Найти цитируемый пост)
В тех исходниках, что лежат на официальном сайте компилятор не может найти tcl.h и io.h. Первый я нашёл в инете, а второй для WinCE хз где... ПОделитесь если есть? И что вы из этих исходников делали? lib или dll ? 

  Я делал Dll, но не для CE. Думаю его можно сделать самому по аналогии с виндовым вариантом или вообще взять от обычного видового, там же основные функции совпадают, тока в других Dll инах. Напильник в руки smile и...

Автор: Brodyaga 24.12.2008, 15:39
Тоесть вы вручную подписывали к функциям export чтоли и т.д.??? так как в исходниках этого нет помоему...

Автор: Alexeis 24.12.2008, 16:05
Цитата(Brodyaga @  24.12.2008,  14:39 Найти цитируемый пост)
Тоесть вы вручную подписывали к функциям export чтоли и т.д.??? так как в исходниках этого нет помоему... 

  Нагуглил def файлик, чуток подправил под обновленную версию. Подключил def к проекту и экспорт готов.

Автор: Brodyaga 24.12.2008, 21:43
Эм... Ну может глупый вопрос.. но я не знаю как подключить def файл к проекту, чтобы он экспорт сам сделал.. или как его использовать таким образом, подскажите плиз? smile

Автор: Brodyaga 27.12.2008, 19:49
Ну что никто не знает? :( Срочно надо...

Автор: Alexeis 27.12.2008, 21:16
Brodyaga, выходные все таки. Вот тут можно почитать как можно создать def file 
http://www.sqlite.org/cvstrac/wiki?p=HowToCompile под заголовком "MSVC and SQLite DLL"

Автор: Brodyaga 28.12.2008, 09:32
Цитата

Brodyaga, выходные все таки. Вот тут можно почитать как можно создать def file 


Так мне не надо создавать деф файл, он у меня есть, мне нужно с помощью него сделать экспорт функции в проекте, чтобы самому к каждой не дописывать экспорт и т.д. Как это сделать?

Автор: masterik 29.12.2008, 21:30
Не имею опыта работы на С++ под WinCE, но успешно использую http://sqlite.phxsoftware.com/ для .NET [Compact] Framework. Эта библиотека через P/Invoke использует откомпилированную под WinCE/WinMo dll'ку SQLite. Отлично работает на Windows Mobile и на Windows CE, так что думаю можно просто выдрать отсюда SQLite dll'ку.

В наборе имеются исходники как managed так и native библиотек.


Автор: Alexeis 31.12.2008, 16:03
Цитата(Brodyaga @  28.12.2008,  08:32 Найти цитируемый пост)
Так мне не надо создавать деф файл, он у меня есть, мне нужно с помощью него сделать экспорт функции в проекте, чтобы самому к каждой не дописывать экспорт и т.д. Как это сделать? 

  Просто добавить def файл в проект, по нему и будет создан экспорт.

Автор: Brodyaga 7.1.2009, 17:48
Цитата

Просто добавить def файл в проект, по нему и будет создан экспорт.


При простом добавлении и компиляции с деф файлом никакой экспорт не создаётся (MSVC2005)

Автор: Alexeis 7.1.2009, 18:28
Цитата(Brodyaga @  7.1.2009,  16:48 Найти цитируемый пост)
При простом добавлении и компиляции с деф файлом никакой экспорт не создаётся (MSVC2005) 

  Значит неправильный def файл. Проще было бы скинуть весь проект smile . Ладно как буду на работе скину проект.

Автор: APro 9.1.2009, 01:15
Всем привет! Я тут тоже выбираю где бы хранить данные. Начал подумывать про SQLite, вот только я пишу, пока что, на Visual Basic ... Как её туда прикрутить? (чтобы было одним файлом)

Автор: Alexeis 9.1.2009, 01:24
APro, ну если барсик поддерживает линковку MS OBJ файлов, то можно.

Автор: APro 9.1.2009, 02:04
Alexeis, а может как-то подробнее?

Автор: Alexeis 9.1.2009, 03:06
  Ну как еще подробнее, билд проекта в С/С++ состоит из 2х частей. 
1) компиляция модулей с, cpp в obj файлы 
2) сборка экзешника из этих скопилированных файлов исполняемого файла. 

Obj файл это уже файл с ассемблером, где нереализованны внешние ссылки то бишь неизвесны адреса функций и переменных из других модулей. Линкер этим и занимается что подставляет правильные адреса. Например в Delphi или асме можно линковать "чужие" модули вместе со своими. Линкер разбирается куда какие адреса подставлять. Билдер умеет линковать делфийские компилированные модули. VC умеет линковать любые модули сделанные в его формате.

  Возможно и в бейсике есть редкие малоиспользуемые директивы для линковки чужих модулей.

Автор: APro 9.1.2009, 14:07
а где лучше хранить данные на 60 000 записей?

Автор: Alexeis 9.1.2009, 14:15
APro, смотря каких данных и как часто их нужно менять. Если это просто лог, в который инфа добавляется в конец, то хватит и текстового файла, если же нужна вставка данных, поиск, организация связей между данными, то это БД.

Автор: t_rex 14.2.2009, 15:53
http://mobile-developer.ru/video-tutorials/video-urok-rabota-s-sqlite-v-windows-mobile/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)