Компиляция SQLite для Windows (64-битная версия)

У меня есть MinGW, и я хочу скомпилироватьSQLite источник объединения в 64-битную DLL. Я довольно новичок в этом виде компиляции, и мои усилия до сих пор привели к провалу. (Я впервые начал использовать объединение autoconf и использовал инструмент configure & amp; make в Linux. Но, очевидно, это никогда не будет работать для двоичных файлов Windows.)

Во всяком случае, мне сказали, что мне нужно следующее определение препроцессора:

Here are the compiler pre-processor defines I use for a 64-bit release build:

WIN64 NDEBUG _WINDOWS _USRDLL NO_TCL _CRT_SECURE_NO_DEPRECATE THREADSAFE=1 TEMP_STORE=1 SQLITE_MAX_EXPR_DEPTH=0

Here are the compiler pre-processor defines I use for a 32-bit release build:

WIN32 NDEBUG _WINDOWS _USRDLL NO_TCL _CRT_SECURE_NO_DEPRECATE THREADSAFE=1 TEMP_STORE=1 SQLITE_MAX_EXPR_DEPTH=0

Я понятия не имел, где их вставить. В конце концов я сделал обоснованное предположение, сделал новый файл (для аккуратности) с именем sqlite3w64.h и вставил следующее:

#define WIN64 NDEBUG
#define _WINDOWS
#define _USRDLL
#define NO_TCL
#define _CRT_SECURE_NO_DEPRECATE
#define THREADSAFE 1
#define TEMP_STORE 1
#define SQLITE_MAX_EXPR_DEPTH 0

Затем я скомпилировал исходный код с помощью следующей команды:

gcc sqlitew64.h sqlite3.h sqlite3ext.h shell.c sqlite3.c -o sqlite_x64.dll

Результатом стал файл DLL размером 733 КБ. Ницца! Это на самом деле работает? Сделал это с ума - я получил исключение BadImageFormatException. Затем я попытался выполнить компиляцию x86, используя тот же метод. Я снова получил DLL-файл размером 733 КБ (это странно?) И еще раз получил исключение BadImageFormatException.

Помогите.

Update

Вместо этого использовал следующую команду:

gcc -shared -DWIN64 -DNDEBUG -D_WINDOWS -D_USRDLL -DNO_TCL -D_CRT_SECURE_NO_DEPRECATE -DTHREADSAFE=1 -DTEMP_STORE=1 -DSQLITE_MAX_EXPR_DEPTH=0 -I. shell.c sqlite3.c -o sqlite_x64.dll -Wl,--out-implib,sqlite3.a

В результате получается файл DLL размером 740 КБ, который по-прежнему создает исключение BadImageFormatException.

Final Update

Оказывается, моя сборка MinGW была только 32-битной. Получение 64-битной версии позволило мне сделать SQLite для 64-битной. Добавление флага -m64 переводит компилятор в 64-битный режим.

64-бит:

gcc -shared -DWIN64 -DNDEBUG -D_WINDOWS -D_USRDLL -DNO_TCL -D_CRT_SECURE_NO_DEPRECATE -DTHREADSAFE=1 -DTEMP_STORE=1 -DSQLITE_MAX_EXPR_DEPTH=0 -m64 -I. shell.c sqlite3.c -o sqlite3_x64.dll -Wl,--out-implib,sqlite3_x64.a

32-бит:

gcc -shared -DWIN32 -D_WINDOWS -D_USRDLL -DNO_TCL -D_CRT_SECURE_NO_DEPRECATE -DTHREADSAFE=1 -DTEMP_STORE=1 -DSQLITE_MAX_EXPR_DEPTH=0 -m32 -I. shell.c sqlite3.c -o sqlite3_x86.dll -Wl,--out-implib,sqlite3_x86.a

MinGW-64 предварительно скомпилировано:http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20111220.zip/download?use_mirror=ignum

Инструкция по установке:http://code.google.com/p/tonatiuh/wiki/InstallingMinGWForWindows64

 Prof. Falken12 июн. 2012 г., 10:18
Тыsure DLL на самом деле 64-битная?
 Prof. Falken11 июн. 2012 г., 14:21
Тем не менее, выcould связать SQLite непосредственно с вашей программой, фактически это рекомендуемый способ использования SQLite. Тогда вам нужен файл .o или .a.
 CJxD12 июн. 2012 г., 18:06
Я даже не уверен, является ли это действительной DLL! Я не могу проверить это больше, чем получить исключение BadImageFormatException, сообщающее, что оно не будет работать. Я попытался использовать DLL с целевым объектом отладки x86, но он все еще не работал.
 CJxD11 июн. 2012 г., 17:40
Хм, не уверен, что это сработает. Я делаю это, потому что я не могу скомпилировать свою программу в один исполняемый файл с оболочкой C # для SQLite, так как она работает в смешанном режиме. Вместо этого я использую их версию только для управляемого, но мне нужно скомпилировать собственный файл sqlite3.dll для работы с ним (в основном из-за того, что 64-битная версия недоступна).
 CJxD11 июн. 2012 г., 17:42
Но если вы можете узнать для меня, как поместить его как файл .o или .a в мою программу на Visual C #, и сможете переключать его для x86 или x64, удовлетворяя System.Data.SQLite; преуспевать!

Ответы на вопрос(2)

Решение Вопроса

make это DLL.

Вам нужно пройтиспециальные опции компоновщика GCC, чтобы заставить его создавать библиотеки DLL. Цитируется с сайта Mingw:(Sort of, I replaced g++ with gcc)

gcc -c -DBUILDING_EXAMPLE_DLL example_dll.cpp
gcc -shared -o example_dll.dll example_dll.o -Wl,--out-implib,libexample_dll.a

На странице также объясняется, что функции, которые вы хотите экспортировать в DLL, должны быть объявлены с помощью__declspec(dllexport), (Далее приведен пример того, как экспортировать все глобальные функции в DLL, как это обычно происходит в Unix.)

-Wl Аргумент к gcc - это то, что говорит gcc передать дальнейшие аргументы--out-implib,libexample_dll.a компоновщику.

Я бы тоже сделал100% Убедитесь, что встроенная DLL на самом деле является 64-битной DLL, а не 32-битной DLL. У вас есть какой-нибудь способ проверить это? В Linux вы можете запустить & quot; файл & quot; команда.

Вы также можете попробовать добавить-m64 опция командной строки gcc, которая должнаforce gcc для назначения цели amd64.

Еслиthat не работает, возможно, у вас неправильный компилятор. Убедитесь, что у вас естьверсия набора инструментов Mingw для x86_64 / amd64, Установка так же проста, какнайти нужный ZIP, распаковать его и указать путь.

Если все это не удается или вы просто хотите проверить, как якобы правильно скомпилированную установку, попробуйтепредварительно скомпилированные 64-битные файлы здесь или жеотсюда.

 11 июн. 2012 г., 14:12
@CJxD, нет, но определяет это вещь препроцессора / компилятора. Если это заканчивается EXE или DLL являетсяlinker вещь, поэтому вам нужно передать параметры компоновщика, чтобы gcc знал, как ссылаться. (DLL-файлы и EXE-файлы похожи, но не одинаковы.) Кстати, этот ответ вам не помог?
 CJxD11 июн. 2012 г., 12:45
Ха, ты прав. Переименование его в exe произвело изящное небольшое консольное приложение. Означает ли это, что игнорируется определение _USRDLL?
 CJxD11 июн. 2012 г., 17:37
Это в основном то же самое, что и другой ответ. Если вы вернетесь назад и посмотрите на то, что я пробовал в обновлении вопроса, вы увидите, что произошло. Я думаю, что кому-то понадобится попробовать это для себя, потому что я просто не могу понять это сам.

это одна команда компоновки и компиляции:

g++ -shared
-DWIN64
-DNDEBUG
-D_WINDOWS
-D_USRDLL
-DNO_TCL
-D_CRT_SECURE_NO_DEPRECATE
-DTHREADSAFE=1
-DTEMP_STORE=1
-DSQLITE_MAX_EXPR_DEPTH=0
-I.
shell.c sqlite3.c
-o sqlite_x64.dll
-Wl,--out-implib,libsqllite_x64.dll.a

Этап компиляции и компоновки будет выполнен сразу. Определенные могут быть добавлены в командной строке. Заголовки не нужно компилировать, но вам нужно передать текущий каталог в качестве каталога поиска заголовка и указать имена DLL и файла импорта.

 CJxD11 июн. 2012 г., 12:42
Попробовал это (заменив g ++ на gcc), и он создал 'a' apos; файл и файл DLL размером 740 КБ; но я все еще получаю то же исключение.

Ваш ответ на вопрос