10
votes

Où est "$" down »défini dans le fichier de script dans Visual Studio?

Il y a des bouchons de macros que Visual Studio utilise dans les paramètres de projet énumérés ici . Je suis incapable de localiser où sont ces macros ou identifiants définis dans le fichier de script actuel (pas dans les paramètres du projet).

Dans mon cas, j'essaie de modifier le dossier de sortie d'un projet à celui de la solution de débogage ou de publication (un niveau supérieur), mais la modification de "répertoire de sortie" dans les paramètres du projet n'a aucun effet.

Il n'y a aucune mention de ces macros dans le fichier .vcxproj non plus, donc je ne sais vraiment pas où ils ont défini? Je suis le plus intéressé par le $ (down) que je veux passer à la solution Dossier de débogage / publication. Est-ce que quelqu'un sait où ils sont définis?


0 commentaires

3 Réponses :


10
votes

Dans Visual Studio 2010, les paramètres principaux du projet définiront un dossier de sortie, la macro qui est définie à partir de cette affectation de dossier est $ (survolée). Il existe d'autres macros prédéfinies que vous ne pouvez pas modifier, mais celle-ci que vous peut .

Si je comprends ce que vous essayez de faire, suivez ces étapes:

  1. Ouvrez la boîte de dialogue Propriétés de votre projet.
  2. En haut de la boîte de dialogue se trouvez deux listes de gouttes, une pour "configuration" et une pour "plate-forme". Sélectionnez l'option "TOUT" "pour la liste de configuration.
  3. sur la page Paramètres généraux en haut est un dossier désigné le "répertoire de sortie". Changez-le à ce qui suit (citations facultatives) "$ (solutiondir) $ (configuration) \" . Le barreau arrière est important. Ceci est le paramètre que $ (down) a finalement choisi par le chemin.
  4. Ouvrez l'élément "Linker" dans l'arborescence gauche. Ensuite, sélectionnez "Général" Paramètres.
  5. dans le volet de droite en haut de la liste est l'option "Fichier de sortie". Il devrait être par défaut à "$ (down) $ (cibleName) $ (TECHNEXT)" . Si ce n'est pas le cas, alors définissez-le comme tel.
  6. reconstruire le monde.

    Remarque: Si vous avez plusieurs cibles de plate-forme (Win32 et X64 par exemple), cela est un peu plus impliqué, mais pas si mal. J'espère que cela aide.


    EDIT OP souhaiterait également que les fichiers PDB et les fichiers de liaison incrémentiels pas doivent être publiés dans le même dossier, mais fait veulent la bibliothèque d'importation publié là-bas. Alors .....

    Pour changer l'emplacement où le fichier PDB est créé:

    1. Ouvrez le fichier de projet, sélectionnez une fois à nouveau l'option "TOUT" "pour modifier toutes les cibles de configuration de construction (voir n ° 2 ci-dessus).
    2. Sélectionnez les paramètres de liaison / débogage dans l'arborescence gauche.
    3. Le deuxième élément du haut doit être le paramètre "Generate Program Database File". Changez-le à "$ (INTDIR) $ (cibleName) .pdb"

      Le fichier de liaison incrémentielle doit être être (à mes connaissances) dans le même dossier que la cible finale. Vous pouvez désactiver la liaison incrémentielle si vous voulez, cependant. Ceci est fait à l'emplacement suivant:

      1. Ouvrez le fichier de projet, sélectionnez une fois à nouveau l'option "TOUT" "pour modifier toutes les cibles de configuration de construction (voir n ° 1 ci-dessus).
      2. Sélectionnez les paramètres de lien / général du projet.
      3. Quatrième élément Down devrait être "Activer la liaison incrémentielle". Définissez-le sur NO .
      4. Si vous désactivez la liaison incrémentielle, vous ne pouvez pas utiliser la fonction de format Modifier & Continuer PDB de débogage de Visual Studio, mais l'interface utilisateur est trop muette pour résoudre ce problème pour que vous puissiez la liaison incrémentielle, alors .. Sélectionnez C ++ / Général dans le volet de projet. Ensuite, s'il est défini sur "Base de données de programme pour édition / continuer", activez-la sur Base de données de programme / ZI .

        Pour déplacer où la bibliothèque d'importation est construite.

        1. Ouvrez le fichier de projet, sélectionnez une fois à nouveau l'option "TOUT" "pour modifier toutes les cibles de configuration de construction (voir n ° 2 ci-dessus).
        2. Sélectionnez Linker / Advanced
        3. Dans le volet de droite sera un élément à mi-chemin, d'importer une bibliothèque. Changez-le à "$ (OUTPORT) $ (TargeName) .Lib"

          Ne me demandez pas comment se débarrasser du fichier de liste d'exportation (.exp) parce que je ne sais honnêtement pas.


16 commentaires

J'ai suivi vos pas (dois dire que # 2 n'est pas très clair mais je comprends que c'est un changement de configuration). Mon projet est un projet DLL et pousse le fichier .dll vers le dossier de débogage de la solution, mais il crée également un fichier .LIK et .PDB sur lequel il devrait créer dans le dossier de débogage régulier. De plus, je voudrais aussi pousser le fichier .Lib dans ce dossier aussi, mais il est toujours créé dans le dossier de débogage d'origine.


@zadane je peux mettre à jour la réponse pour cela aussi. Je préfère appuyer sur le fichier PDB dans un sous-dossier du dossier de sortie de la version appelé "pdb" (original, je sais = p) poussant la bibliothèque d'importation n'est pas trop difficile. Donne moi une minute.


Le .pdb est toujours créé dans la solution de débogage et il y a les fichiers .exp, ILK, également là-bas, comme vous l'avez souligné, mais j'ai créé un projet de DLL factice et ils créent également ces fichiers là-bas, donc je suppose que c'est combien nous pouvons aller pour l'instant , Merci!


Une question secondaire que je pensais peut-être que vous savez. Étant donné que les libaraires sont maintenant dans le dossier Solution \ Debug, mon autre projet ne peut pas le trouver. Je pensais que ce pli est automatiquement mis à jour sur les chemins de projet. Dois-je modifier cela dans la liaison> Entrée> Dépendances supplémentaires explicitement ou il existe un moyen d'inclure le dossier Solution \ Debug sur le chemin de recherche de la bibliothèque? Cela semblerait mieux pour moi!


@zadane Désolé j'étais absent pendant un moment là. Les autres projets ne devraient vaudoir que chercher la bibliothèque d'importation Les nouveaux emplacements vous fournir (a) ont des dépendances de bibliothèque de liaison " activé dans la page de configuration du projet / Lien / Général des paramètres de chaque projet de consommation, et < / I> Demandez à vos projets correctement configurés dans les dépendances du projet (cette DLL dépend de cette DLL, cet exe dépend de ces deux dlls, etc.). Si vous définissez cela correctement, vous n'avez même pas besoin de répertorier L'Import Libs sur la ligne de bibliothèques supplémentaires des projets de consommation. Msbuild les câblé gratuitement pour vous gratuitement.


Malheureusement, je l'ai fait et cela donne toujours une erreur de liaison. Je me suis assuré que le projet dépend de lui et définit les dépendances de la bibliothèque de liaison sur Oui. Il est livré avec un message d'erreur Lien: erreur fatale LNK1104: impossible d'ouvrir le fichier 'usbdll.lib' si je copie la lib / dll à l'ancien emplacement (racine du projet) qu'elle ne construit bien. Ce serait plutôt génial si cela avait fonctionné en reliant les projets.


Si tel est le cas, vous avez toujours la bibliothèque d'importation de votre DLL dans vos bibliothèques supplémentaires, les paramètres Link-Config de tout projet se placent à ce sujet (probablement votre EXE par votre description). Comme je l'ai dit, si vous configurez les dépendances de projets correctement et établissez le paramètre de liaison pour «Link Bibliothèque dépendances» à True, vous n'avez pas besoin de la bibliothèque d'importation sur votre liste LIB. Msbuild le mettra là pour vous à la hauteur de la construction. Vérifiez et assurez-vous que ce n'est pas dans votre liste LIB sur vos paramètres de liaison et assurez-vous que les dépendances sont liées et vos députés ProJ sont configurés correctement.


Ce que vous dites a du sens, mais cela ne fonctionne tout simplement pas. J'ai eu la bibliothèque DLL énumérée dans des bibliothèques supplémentaires de mon projet EXE, donc je l'ai supprimée par votre suggestion, mais je reçois maintenant une erreur de liaison pour des fonctions qui figurent dans la bibliothèque. Je devais ajouter la voie du répertoire de débogage de la solution, mais je sais que c'est une mauvaise idée 'cz i pour la version libérée, ce sera dans le dossier de sortie.


Je ne peux pas l'expliquer si vous avez les dépendances du projet appropriées. Si le projet MyExe dépend du projet MYDLL (et vous pouvez vérifier cela dans les dépendances du projet ... Dialogue de configuration dans le menu Projet et Vous avez définitivement défini sur la configuration de la liaison de MyExe pour lier les dépendances de la bibliothèque comme activé, le Linker doit être nourrie toute bibliothèque d'importation générée créée à partir de MyDLL, y compris son emplacement spécifique. Basé sur la configuration de construction actuelle (débogage ou publication). Je viens de l'essayer et cela a fonctionné sur un projet de test local ici. Alors quelque chose ne sent toujours pas droit.


Vous pouvez également activer la sortie Verbose de la liste des lieurs dans les options de liaison et voir dans la fenêtre de sortie tout ce que le linker est chargé (qui sera une Hella-beaucoup d'informations, vous voudrez peut-être vous tonifier à ce que vous êtes à la recherche de).


Je viens de créer une toute nouvelle solution avec deux nouveaux projets de test. Calcator.exe utilise une fonction de mathlib.lib (DLL Project) à SQR un numéro. J'ai fait dépendre l'exe des dépendances des bibliothèques EXE et de liaison est déjà sélectionnée pour YES dans les paramètres du projet d'EXE. Bien sûr, je inclus le fichier d'en-tête de DLL dans EXE et j'espérais que je n'ai rien à ajouter d'autre et que cela devrait le chercher. Je reçois une erreur similaire comme dans l'autre projet. CalculatordLG.OBJ: Erreur LNK2019: Symbole externe non résolu "Int __cdecl makedouble (int)


Peut-être que si je peux résoudre ce problème dans mon projet de test simple, cela devrait me donner l'indice!


@zadane Ok, cela sonnera un peu étrange, mais ouvrira vos paramètres de projet EXE. ci-dessus Les propriétés de la configuration sont un nœud appelé "propriétés communes" en ce qu'il ne devrait y avoir qu'une seule chose, "cadres et références". Ajoutez votre projet DLL comme référence pour votre projet EXE. Appliquez ensuite, sauvegardez, etc. puis reconstruisez. Remarque: Ceci est censé être pour .NET, aucune idée de la raison pour laquelle il est nécessaire pour les projets C / C ++. Je suppose que votre projet DLL exporte correctement ses biens, vous semblez que vous connaissez votre chemin autour de Devstudio. Donnez-le donc un coup.


Laissez-nous Continuer cette discussion en chat


Ce dernier truc - l'ajout de référence dans les cadres et les références fixe le problème. Merci!


@zadane très heureux de l'entendre.



3
votes

La majorité de ces macros sont définies dans le fichier msbuild cibles inclus dans chaque projet VS2010. Quelque part dans votre fichier de projet, probablement près du bas, vous trouverez une ligne comme celle-ci:

<PropertyGroup>
  <TargetDir Condition="'$(OutDir)' != ''">$([MSBuild]::Escape($([System.IO.Path]::GetFullPath(`$([System.IO.Path]::Combine(`$(MSBuildProjectDirectory)`, `$(OutDir)`))`))))</TargetDir>
  <TargetPath Condition=" '$(TargetPath)' == '' ">$(TargetDir)$(TargetFileName)</TargetPath>
  <ProjectDir Condition=" '$(ProjectDir)' == '' ">$(MSBuildProjectDirectory)\</ProjectDir>
  <ProjectPath Condition=" '$(ProjectPath)' == '' ">$(ProjectDir)$(ProjectFileName)</ProjectPath>
      .
      .
      .
</PropertyGroup>


0 commentaires

0
votes

Permettez-moi de partager ce que j'ai découvert depuis que je posais cette question. Ces macros / propriétés sont des valeurs par défaut VS2010, mais vous pouvez les définir vous-même dans des fichiers .vcproj en le modifiant dans le Bloc-notes. Remarque: recherchez d'abord pour la propriété dans le fichier .vcproj, si c'est là que changez sa valeur à désirée, sinon le définissez comme ci-dessous. J'y pense que cela détermine ces définir en ajoutant / les modifier dans des fichiers .vcproj. xxx

J'ai défini mon propre groupe "Mes valeurs" pour conserver ces valeurs mais que vous pouvez les définir n'importe où. Je préfère les définir aussi haut dans le fichier que possible afin que le reste du script prenne en compte.


0 commentaires