Вопрос по sqlite, 64bit, windows, gcc, c – Компиляция SQLite для Windows (64-битная версия)

10

У меня есть 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

Хм, не уверен, что это сработает. Я делаю это, потому что я не могу скомпилировать свою программу в один исполняемый файл с оболочкой C # для SQLite, так как она работает в смешанном режиме. Вместо этого я использую их версию только для управляемого, но мне нужно скомпилировать собственный файл sqlite3.dll для работы с ним (в основном из-за того, что 64-битная версия недоступна). CJxD
Тыsure DLL на самом деле 64-битная? Prof. Falken
Я даже не уверен, является ли это действительной DLL! Я не могу проверить это больше, чем получить исключение BadImageFormatException, сообщающее, что оно не будет работать. Я попытался использовать DLL с целевым объектом отладки x86, но он все еще не работал. CJxD
Тем не менее, выcould связать SQLite непосредственно с вашей программой, фактически это рекомендуемый способ использования SQLite. Тогда вам нужен файл .o или .a. Prof. Falken
Но если вы можете узнать для меня, как поместить его как файл .o или .a в мою программу на Visual C #, и сможете переключать его для x86 или x64, удовлетворяя System.Data.SQLite; преуспевать! CJxD

Ваш Ответ

2   ответа
4

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

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 и файла импорта.

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

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-битные файлы здесь или жеотсюда.

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

Похожие вопросы