Bonjour,

Après avoir un peu bataillé pour arriver à mes fins,je post pour expliquer le problème et sa résolution (2 en 1 !)

Le problème :
Utiliser Sqlite en dll dans un gros projet environnement win, donc évidemment sans toucher les sources, le tout avec CMake (et Qt creator mon EDI favori )

Le problème étant que dans les sources de Sqlite on n'a pas de __declspec(dllexport), donc quand on compile, on a bien la dll mais pas le fichier lib (fichier d'import) utile à l'édition des liens pour le reste du projet.

La solution :
Il est possible de construire le .lib à partir des sources et du fichier .def (module de définition) qui agit comme une table des fonctions que l'on peut exporter.

Après avoir télécharger les sources sqlite (amalgamation pour être simple), on inclut le .c et le .h correspondant en omettant le sqlite3ext.h.
Le .def peut être récupéré par le biais du zip contenant la dll. Le .def est alors mis avec les sources dans le même répertoire.

Il faut alors éditer le .def en ajoutant les lignes suivantes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
sqlite3_column_database_name
sqlite3_column_database_name16
sqlite3_column_table_name
sqlite3_column_table_name16
sqlite3_column_origin_name
sqlite3_column_origin_name16
sqlite3_table_column_metadata
Par ailleurs, pour que le compilateur génère le .lib (ca doit dépendre du compilo, j'ai pas fait trop d'essai donc je parle pour Nmake de mvsc), il faut inclure ce fichier avec la commande /DEF:<nom du fichier .def>.
Avec CMake, pas de problème, c'est directement réalisé en l'ajoutant dans la commande ADD_LIBRARY. Par ailleurs la doc de CMake précise que l'on peut rajouter le flag nécessaire au linker pour utiliser le .def lors de la création de la dll, par le biais de la variable CMAKE_LINK_DEF_FILE_FLAG. Avec Nmake il faudrait donc mettre "/DEF", dans la pratique si on omet la définition de cette variable, CMake fait tout bien comme il faut .

La où j'ai un peu galéré c'est que le .lib n'était pas créé, donc problème d'édition des liens dans mon projet. La raison (qui n'apparaissait pas dans ma console) c'est que des liens n'étaient pas résolu pour la création de ce .lib, tout simplement parce que sqlite est prévu modulaire. Il faut donc soit virer les bouts qui ne vous interressent pas dans le fichier .def, soit ajouter les directives au préprocesseur par le biais de la commande ADD_DEFINITIONS de CMake. In fine, je vous passe le CMakelists qui marche avec le .def complet de SQLite

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#in order to build a .lib import file, add .def
SET(SQLITE_SRCS
sqlite3.c
sqlite3.h
sqlite3.def
)
 
#Specific stuff for sqlite3 add definition to the preprocessor
ADD_DEFINITIONS(-DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_RTREE)
 
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
 
ADD_LIBRARY(sqlite3 SHARED ${SQLITE_SRCS})
Voili voilou, en espérant que ca peut aider des gens...