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 :

  1. Faire un clic droit sur le projet puis aller dans 'Dépendances du projet'.

  2. 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 :

  1. Aller dans les propriétés du projet > Editeur de liens > Entrée > Dépendances suppmémentaires

  2. 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".