Compiler SQLite pour Windows (64-bit)

j'ai MinGW et je souhaite compiler SQLite fusion source dans une dll 64-bit. Je suis assez nouveau à ce genre de compilation et mes efforts jusqu'à présent ont abouti à l'échec. (J'ai d'abord commencé à utiliser l'amalgamation autoconf et j'ai utilisé l'outil Configurer et faire sous Linux. Mais apparemment ça ne marchera jamais pour les binaires Windows.)

de toute façon, j'ai dit que j'ai besoin de la suite de préprocesseur:

Voici le compilateur le pré-processeur définit que j'utilise pour une version 64 bits:

  • WIN64 NDEBUG
  • _WINDOWS
  • _USRDLLL
  • NO_TCL
  • _CRT_SECURE_NO_DEPRECATE
  • THREADSAFE=1
  • TEMP_STORE=1
  • SQLITE_MAX_EXPR_DEPTH=0

voici le pré-processeur du compilateur que j'utilise pour une version 32 bits:

  • WIN32
  • NDEBUG
  • _WINDOWS
  • _USRDLLL
  • NO_TCL
  • _CRT_SECURE_NO_DEPRECATE
  • THREADSAFE=1
  • TEMP_STORE=1
  • SQLITE_MAX_EXPR_DEPTH=0

Je ne savais pas où les mettre. J'ai finalement pris une hypothèse instruite, fait un nouveau dossier (pour neatness) appelé sqlite3w64.h et collé dans ce qui suit:

#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

j'ai alors compilé de la source avec la commande suivante:

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

ce qui en a résulté est un fichier DLL 733KB. Nice! N'avait-elle vraiment efficace? Il l'a fait écrous - j'ai eu un BadImageFormatException. J'ai aussi essayé de faire une compilation x86 en utilisant la même méthode. Encore une fois, J'ai un fichier DLL 733KB (c'est bizarre?) et encore une fois, j'ai eu un BadImageFormatException.

à L'aide.

mise à Jour

Utilisé la commande suivante à la place:

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

a abouti à un fichier DLL de 740KB ce qui donne encore une BadImageFormatException.

Mise À Jour Finale

il S'avère que ma construction MinGW était en 32 bits seulement. Obtenir une version 64-bit m'a ensuite permis de faire SQLite pour 64-bit. L'ajout du drapeau-m64 permet de mettre le compilateur en mode 64 bits.

64 bits:

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 bits:

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 Précompilé: http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-mingw_20111220.zip/download?use_mirror=ignum

Instructions D'Installation:http://code.google.com/p/tonatiuh/wiki/InstallingMinGWForWindows64

10
demandé sur CJxD 2012-06-11 14:03:43

2 réponses

vous compilez pour un EXE. Appeler ça une DLL ne sera pas comme par magie!--4--> c'est une DLL.

Vous avez besoin de passer spécial options du linker gcc à faire c'est de créer des Dll. Extrait du site de Mingw: (sorte de, j'ai remplacé g++ par gcc)

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

la page explique aussi que les fonctions que vous voulez que votre DLL exporte, doivent être déclarées avec __declspec(dllexport). (Plus bas, il y a un exemple sur la façon d'exporter toutes les fonctions globales à la DLL, comme ça arrive souvent dans Unix.)

- Wl argument de gcc est ce que dit gcc pour passer sur les autres arguments --out-implib, libexample_dll. pour l'éditeur de liens.

je voudrais aussi faire 100% assurez-vous que les haut DLL est en fait une version 64 bits DLL et pas un 32 bits DLL. Avez-vous aucun moyen de vérifier? Sous Linux, vous pouvez exécuter la commande "file".

Vous pouvez aussi essayer d'ajouter le -m64 option vers la ligne de commande gcc, qui devrait force gcc cible la cible amd64.

Si ne fonctionne pas, vous avez peut-être le mauvais compilateur. Assurez-vous que vous avez la version x86_64 / amd64 de la chaîne D'outils Mingw. L'Installation est aussi simple que trouver le bon ZIP, le déballer, et définir le chemin.

si tout cela échoue, ou si vous voulez juste vérifier par rapport à une configuration supposée correctement compilée, essayez précompilé 64 bits les binaires ici ou de là.

7
répondu Prof. Falken 2012-06-13 11:24:53

ce qui fonctionnerait dans votre cas, c'est cette commande unique Lien-et-compiler:

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

l'étape de compilation et de lien sera effectuée immédiatement. Le défini peut être ajouté sur la ligne de commande. Les en-têtes n'ont pas besoin d'être compilés, mais vous devez passer le répertoire courant comme un répertoire de recherche d'en-tête, et spécifier les noms du fichier dll et d'importation.

4
répondu rubenvb 2012-06-11 10:21:35