F.A.Q. de compilation avec Visual Studio
Migration des projets de VS2008 à VS2010 : FAQ migration VS
Impossible de charger un projet
Visual Studio (particulièrement VS2015) n'arrive pas à charger un projet et marque "indisponible", c'est probablement qu'il manque l'option "desktop" :
Faire un clic droit sur un projet et cliquer sur "Installer le ou les composants manquants".
Comment rechercher l'origine d’une erreur ?
Lors de la génération, le rapport complet s’enregistre dans la fenêtre 'Sortie'. Et à la fin, le résultat s’affiche :
Génération : 48 a réussi, 3 a échoué, 0 a été ignoré
Mais la recherche d’une erreur dans ce rapport n’est pas simple. Pour plus de facilité, consultez la 'Liste des erreurs' (disponible dans 'Affichage > Liste des erreurs').
Un double-clic sur la ligne d'une erreur ouvre le fichier concerné (sauf si erreur de linking) et positionne le curseur dans le rapport de sortie 'Sortie'.
Mauvaise configuration
Erreur 1 general error c10100b1: Failed to load file "..\..\systeme_debug\bin\OxygenePch.dll". Le fichier spécifié est introuvable.
Vérifiez que vous êtes bien dans la configuration Release !
Problème de création de la DLL
Si vous avez l’erreur suivante :
LINK : fatal error LNK1168: impossible d'ouvrir ..\..\systeme\bin\compo.dll pour écrire
C’est peut-être tout simplement qu’elle est en cours d’utilisation ! Fermez ou relancez la session Oxygène.
Erreur de traduction
error PRJ0019: Un outil a retourné un code d'erreur à partir de "Traduction des fichiers l4g"
ou
Traduction des fichiers l4g
Le chemin d'accès spécifié est introuvable.
Vérifiez, dans les propriétés du projet, que le chemin de destination est correct (Général > Répertoire de sortie).
Problème avec l’en-tête précompilé
error LNK2011: objet précompilé absent de l'édition de liens ; l'image ne peut pas être exécutée
Vérifiez que le projet OxygenePch fait parti de votre solution et qu’il est généré correctement : faites 'Régénérer' et vérifiez la date et l’heure du fichier systeme\include\oxygene.pch
Vérifiez que votre projet porte bien une dépendance sur le projet OxygenePch.
Vérifiez les propriétés du projet (C/C++ > En-têtes précompilés) que 'Création/Utilisation d’un en-tête précompilé en spécifiant un nom de fichier' contienne 'oxygene.hpp' et que 'Fichier d’en-tête précompilé' contienne le bon chemin (ex : $(TargetDir)..\include\oxygene.pch).
Le fichier d'en-tête précompilé est issu d'une version antérieure
fatal error C1853: Le fichier d'en-tête précompilé 'Release/mon_projet.pch' est issu d'une version antérieure du compilateur, ou l'en-tête précompilé est en C++ et vous l'utilisez en C (ou inversement)
Supprimez le projet OxygenePch et créez un nouveau projet Oxygène temporaire. Cela va recréer le projet OxygenePch : vous pouvez supprimer le projet temporaire.
Symbole externe non résolu
error LNK2001: symbole externe non résolu "protected: virtual void __thiscall MonModele::abandon(class Evt *)" (?abandon@ MonModele @@MAEXPAVEvt@@@Z)
Vérifiez que votre projet porte bien une dépendance sur le projet contenant « MonModele ».
Voir Les dépendances.
Erreur à partir de "Globalisation des ressources"
error PRJ0019: Un outil a retourné un code d'erreur à partir de "Globalisation des ressources" COMPO1
Une ressource n'a pas pu être ajoutée au fichier global. Le projet concerné ci-dessus est COMPO1. Le détail de l'erreur est précisé dans la fenêtre de sortie.
Le cas le plus fréquent est l'existence d'une ressource ayant un nom de plus de 8 caractères.
Impossible de créer un projet
Le projet ne peut pas être créé car un autre projet existe déjà dans le dossier ...
Vérifiez qu’il ne reste pas un fichier BC5 (en particulier un fichier .dsw).
Impossible d'ouvrir le fichier include
fatal error C1083: Impossible d'ouvrir le fichier include : 'gcmgest.hpp' : No such file or directory c:\Oxygene\oxydev\gescom\gcpcli\cpp\gestion.hpp
Si le compilateur ne trouve pas certains fichiers C++, ajoutez leur chemin dans les propriétés du projet > C/C++ > Autres répertoires Include. (ex: ..\..\gescom\gcmutil\cpp).
Cela arrive généralement si votre projet dérive un projet utilisant un modèle non standard déclaré dans un autre projet.
Exemple : le projet GCCLI dérive le composant PPTCLI du C.R.M. (PPTCLI utilisant un modèle de PPMMODEL) :
Modifier le répertoire de sortie
Si vous avez déplacé un projet d'un niveau de répertoire, il vous faudra modifier le répertoire de sortie, c'est à le répertoire dans lequel sera produit la DLL et le GLB.
Aller dans les propriétés du projet > Propriétés de configuration > Général > Répertoire de sortie et saisissez le chemin relatif de destination.
Attention ! Suivant la configuration sélectionnée, le répertoire peut être différent :
Pour la configuration Release (par défaut), le chemin est normalement '..\..\systeme\bin'.
Pour la configuration Debug, le chemin est normalement '..\..\systeme_debug\bin'.
Changer l'extension d'une DLL
Pour modifier l'extension du fichier de sortie d'un projet en DLL, RUN ou IOX, aller dans les propriétés du projet > Editeur de liens > Général > Fichier de sortie.
La valeur par défaut est $(OutDir)\$(ProjectName).dll.
Problèmes dans du code en C++
Les principales erreurs viennent du fait que le compilateur C++ de Visual Studio est moins permissif que celui de Borland, que les types sont parfois différents et que certaines bibliothèques sont différentes.
Si votre code C++ provient de la traduction sous Borland, beaucoup de choses seront à changer sinon les corrections devraient être mineures. Consultez l'aide MSDN de Microsoft.
Dir.h
fatal error C1083: Impossible d'ouvrir le fichier include : 'dir.h' : No such file or directory
Le fichier dir.h n’existe pas dans VC++ mais des fonctions similaires existent. Supprimez la ligne #include <dir.h>. Si vous utilisiez la structure ffblk, consultez l’erreur suivante.
error C2079: 'ffblk1' uses undefined
error C2079: 'ffblk1' uses undefined struct '(Evt *)M_ETATSelect_etat::liste_etat::ffblk'
error C3861: 'findfirst': identifier not found, even with argument-dependent
lookup
error C2228: left of '.ff_name' must have class/struct/union type
Le source devait utiliser dir.h. Vous pouvez remplacer :
int done;
struct ffblk ffblk1;
done = findfirst(v_chemin,&ffblk1,0);
while (!done)
{
(...)
c_code = ffblk1.ff_name;
(...)
done = findnext(&ffblk1);
}
par
int done;
struct _finddata_t ffblk1;
done = _findfirst(v_chemin,&ffblk1);
while (!done)
{
(...)
c_code = ffblk1.name;
(...)
done = _findnext(done, &ffblk1);
}
Impossible de convertir
error C2664: 'RegSetValueExA' : impossible de convertir le paramètre 5 de 'const char *' en 'const BYTE *'
Bien souvent un simple ‘cast’ suffit à corriger le problème. Mais vérifiez bien que les types soient compatibles (tailles, plages de valeurs …).
Par exemple, remplacer :
RegSetValueEx(a, *b, 0, c, *d, e);
Par
RegSetValueEx(a, *b, 0, c, (BYTE*)*d, e);
ShellExecute
error C3861: 'ShellExecute': identificateur introuvable, même avec une recherche qui dépend de l'argument
Ajouter dans les déclarations globales du L4G :
CINCL: _C{ #include <shellapi.h> }
Parsing could not recover
sorry, parsing could not recover
Ceci est une erreur de reconnaissance syntaxique du langage L4G Oxygène par Visual Studio.
Ignorez-la ; la compilation de vos projet n'en est nullement affectée.
Les dépendances
Qu'est-ce qu'une dépendance ?
La génération d'une DLL nécessite souvent des informations définies dans d'autres DLL.
Par exemple, toute DLL destinée à Oxygène a besoin de connaître les types et fonctions spécifiques à Oxygène. C'est pour cela que l'assistant de création de projet ajoute automatiquement une dépendance à OxygenePch.
Vous n'avez pas à gérer ce lien.
Par contre, si vous utilisez un modèle non standard défini dans une autre DLL ou si vous faites une dérivation, vous devrez fixer des dépendances. L'assistant de création de projet vous aide pour la majorité des cas. Mais pour les autres cas, vous devez vous même paramétrer votre projet.
Exemple : votre projet X utilise un modèle défini dans un autre projet M. Il faut ajouter une dépendance de X sur M. Il en va de même si X dérive M.
Comment ajouter une dépendance ?
L'assistant de création de projet propose de saisir les dépendances dans l'onglet 'Modèles et dérivation'. Si vous devez les ajouter après la création du projet, deux cas sont possibles :
Le projet M dont dépend le projet X se trouve dans la même solution :
Faire un clic droit sur le projet puis aller dans 'Dépendances du projet'.
Cocher le projet M dont dépend X.
Exemple: le projet GCPCLI utilise des modèles définis dans les projets GCMCONTA, GCMMAJ, GCMUTIL et GCMVENTE.
Le projet M dont dépend le projet X ne se trouve pas dans la même solution :
Aller dans les propriétés du projet > Editeur de liens > Entrée > Dépendances suppmémentaires
Ajouter la nom de librairie (ou bibliothèque) d'importation (ex: M.LIB).
Exemple : le projet GRCCLI dérive le composant PPTCLI : on ajoute la librairie pptcli.lib. Or PPTCLI utilise un modèle défini dans PPMMODEL, donc on ajoute également la librairie ppmmodel.lib :
Format PDB non compatible
Format PDB non compatible dans ...systeme\bin\a3moulin.pdb. Supprimez et régénérez
Allez dans les propriétés du projet puis dans "Editeur de lien > Débogage". Désactivez , l'option "Générer des infos de débogage".