2010-06-20 11 views
11

Ho una soluzione C++ in VS2008 con più progetti. Questa soluzione contiene i file necessari in fase di runtime, che vengono caricati in base a un percorso relativo alla directory della soluzione (ad esempio "Testing/data/" + "dataN.bin").Modifica della "directory di debug/di lavoro" globalmente (non per utente) in VS2008

Affinché questa soluzione per lavorare, devo impostare la directory di lavoro impostazione nel progetto (s) in modo che punterà alla directory soluzione (ad esempio Configuration Properties >> Debugging >> Working Directory = $(SolutionDir)). Funziona bene quando eseguo il debug sul mio PC. Tuttavia, quando un utente diverso carica la mia soluzione, i suoi progetti non hanno questa proprietà impostata correttamente.

Ho tracciato questa impostazione per non essere memorizzato nel file di progetto (PROJECT.vcproj), ma nel file specifico dell'utente creato per esso (PROJECT.vcproj.DOMAIN.USER.user).

Vorrei un modo per memorizzare questa impostazione per TUTTI gli utenti, senza doverla impostare manualmente ancora e ancora.

I miei pensieri erano:

  • trovare un modo per negozio questo nel file .vcproj (non quello specifico per l'utente) o il file di soluzione.
  • Trovare un modo per creare un "file specifico utente predefinito", da cui verranno avviate tutte le impostazioni specifiche dell'utente (e possono essere modificate in seguito).

Tuttavia, non ho trovato un modo per fare uno di questi.

Un paio di note/vincoli:

  • ho bisogno di lavorare con molti file di grandi dimensioni come queste risorse, quindi vorrei evitare di eseguire copie da diverse directory.
  • Le soluzioni devono supportare più configurazioni di build (debug, release, ecc.).
  • Vorrei evitare gli script di pre/post build, se possibile, per mantenere le cose semplici (priorità bassa).

Qualsiasi aiuto sarà apprezzato ... grazie in anticipo.

risposta

4

Non esiste alcuna proprietà di questo tipo. Ci sono problemi più grandi, anche questo deve funzionare dopo aver distribuito la soluzione. La directory di lavoro quindi non sarà una directory "soluzione", non ce n'è una sul computer di destinazione.

Si sta molto meglio lavorando partendo dal presupposto che la directory di lavoro sia la stessa della directory EXE. Quello sarà il default sia durante il debug che sul computer di destinazione. Hai il pieno controllo sulla posizione del file EXE con un'impostazione linker. E puoi proteggerti da un collegamento che esegue il tuo programma con un'altra directory di lavoro ottenendo la directory EXE nel tuo codice in modo da poter generare un percorso assoluto. Utilizzare GetModuleFileName(), passare NULL per ottenere il percorso del file EXE.

Un'altra soluzione standard consiste nel copiare qualsiasi tipo di risorse di cui l'EXE ha bisogno in una cartella relativa rispetto alla cartella di output di compilazione. A tale scopo, con un evento pre-generazione, rendono la riga di comando simile a questo:

if not exist "$(OutDir)\Testing" md "$(OutDir)\Testing" 
xcopy /d /s "$(SolutionDir)\Testing\*.*" "$(OutDir)\Testing 

Si noti come l'opzione/d assicura che la copia viene eseguita solo se il contenuto della cartella Test cambiato.

+0

Copia delle risorse: questo sarebbe il trucco, tuttavia ho una grande quantità di risorse da copiare (in questo caso, i vettori di test di grandi dimensioni), e sarebbe uno spreco di tempo e di memoria per copiarle ogni volta. Inoltre, ho più configurazioni di build (release, debug, ...), che causeranno ulteriori duplicazioni che desidero evitare. Ha senso che questi vettori siano nella directory "soluzione" di root, dato che questi dati sono usati da più progetti (in modi diversi). Inoltre, vorrei mantenere l'ordine nell'elenco dei file della soluzione (riguardante la struttura delle directory). – scooz

+0

Il rovescio della medaglia, copiare il risultato dell'eseguibile nella directory della root solution non solo causerà un disordine nella directory root, ma non supporterà correttamente più configurazioni di build (manterrà i file con lo stesso nome, ecc.). Sembra che per scopi di debug, la cosa più logica da fare sia cambiare la directory di lavoro. Riguardo ai problemi di distribuzione che hai sollevato (che sono d'accordo), preferirei complicare le cose lì rispetto a quando eseguo il debug (poiché distribuisco meno spesso di quanto non faccia il debug) – scooz

+0

Questo è il motivo per cui ho sottolineato il comportamento dell'opzione xcopy/d. Stai pagando la copia una sola volta. –

0

Mi chiedo se questo sarebbe possibile dal momento che un utente potrebbe non avere abbastanza diritti per accedere e leggere/scrivere nella directory, suppongo che VS controlli se un utente ha accesso a una directory quando lo scegli che probabilmente è il motivo per cui è solo un'opzione basata sull'account.

1

Si potrebbe considerare l'uso di 'Proprietà di configurazione/Generale/Directory di output' o 'Proprietà di configurazione/Linker/File di output', invece dell'impostazione 'Debugger/directory di lavoro'. Queste impostazioni sono per progetto e non per utente e se si lascia intatta la directory di lavoro questo è il valore predefinito per la directory di lavoro dell'app.

+0

Se le cose non vanno a modo mio, avrei potuto andare in questo modo, nonostante la mia volontà per evitare questo (vedi il mio commento alla risposta di Hans passant). Questo comportamento non era diverso nelle versioni precedenti di Visual Studio (ad esempio, 2005)? – scooz

10
  1. Configurare le impostazioni di debug come al solito (impostare la directory di lavoro, impostare i parametri, ecc ...), ma utilizzare solo percorsi relativi, variabili. NON utilizzare percorsi assoluti come D: \ MyProject \ libs
  2. Salvare la soluzione e quindi chiudere Visual Studio.
  3. Vai alla directory del progetto e trovare PROJECT.vcproj.COMPUTERNAME.USER.user
  4. Rinominare a PROJECT.vcproj.user (Questo file sarà la configurazione di debug generici, si può commettere è al controllo del codice sorgente)
  5. Apri Visual Studio, aggiungi le tue aggiunte aggiuntive alle tue impostazioni di debug se necessario. (Ulteriori informazioni saranno memorizzate nel file PROJECT.vcproj.COMPUTERNAME.USER.user che è specifico a voi. Si noti che PROJECT.vcproj.COMPUTERNAME.USER.user avrà la precedenza configurazione ereditato)

progetto di esempio. file di vcproj.user viene fornito di seguito

<?xml version="1.0" encoding="Windows-1252"?> 
<VisualStudioUserFile 
    ProjectType="Visual C++" 
    Version="9,00" 
    ShowAllFiles="false" 
    > 
    <Configurations> 
     <Configuration 
      Name="Release|Win32" 
      > 
      <DebugSettings 
       Command="$(ProjectDir)..\Deploy\$(ConfigurationName)\$(TargetFileName)" 
       WorkingDirectory="$(ProjectDir)..\Deploy\$(ConfigurationName)\" 
       CommandArguments="" 
       Attach="false" 
       DebuggerType="3" 
       Remote="1" 
       RemoteMachine="LOCALHOST" 
       RemoteCommand="" 
       HttpUrl="" 
       PDBPath="" 
       SQLDebugging="" 
       Environment="" 
       EnvironmentMerge="true" 
       DebuggerFlavor="0" 
       MPIRunCommand="" 
       MPIRunArguments="" 
       MPIRunWorkingDirectory="" 
       ApplicationCommand="" 
       ApplicationArguments="" 
       ShimCommand="" 
       MPIAcceptMode="" 
       MPIAcceptFilter="" 
      /> 
     </Configuration> 
     <Configuration 
      Name="Debug|Win32" 
      > 
      <DebugSettings 
       Command="$(ProjectDir)..\Deploy\$(ConfigurationName)\$(TargetFileName)" 
       WorkingDirectory="$(ProjectDir)..\Deploy\$(ConfigurationName)\" 
       CommandArguments="" 
       Attach="false" 
       DebuggerType="3" 
       Remote="1" 
       RemoteMachine="LOCALHOST" 
       RemoteCommand="" 
       HttpUrl="" 
       PDBPath="" 
       SQLDebugging="" 
       Environment="" 
       EnvironmentMerge="true" 
       DebuggerFlavor="0" 
       MPIRunCommand="" 
       MPIRunArguments="" 
       MPIRunWorkingDirectory="" 
       ApplicationCommand="" 
       ApplicationArguments="" 
       ShimCommand="" 
       MPIAcceptMode="" 
       MPIAcceptFilter="" 
      /> 
     </Configuration> 
    </Configurations> 
</VisualStudioUserFile> 
+2

Sembra che tu possa rimuovere tutto le proprietà eccetto WorkingDirectory se questo è l'unico per cui si desidera impostare un valore predefinito – Joe

Problemi correlati