2010-06-20 15 views
11

我在VS2008中有一個包含多個項目的C++解決方案。此解決方案包含運行時所需的文件,根據相對於解決方案目錄(例如"Testing/data/" + "dataN.bin")的路徑加載。在VS2008中全局更改「調試/工作目錄」(不是每個用戶)

爲了實現此解決辦法,我必須設置工作目錄中的項目(S)設置,使其指向解決方案目錄(例如Configuration Properties >> Debugging >> Working Directory = $(SolutionDir))。當我在自己的PC上進行調試時,這工作正常。但是,當不同的用戶加載我的解決方案時,他的項目沒有正確設置此屬性。

我已將此設置追蹤存儲到項目文件(PROJECT.vcproj)中,但不是存儲在爲其創建的用戶特定文件(PROJECT.vcproj.DOMAIN.USER.user)中。

我想一種方式,存儲所有用戶的這種設置,無需手動一次又一次地設置。

我的想法是:

  • 找到一個方法來其存儲在.vcproj文件(而不是用戶特定的)或解決方案文件。
  • 找到一種方法來創建一個「默認用戶特定文件」,使所有用戶特定的設置將開始(而且可以隨意在以後修改)。

但是,我沒有找到一個方法來做到任一。

多幾個注意事項/限制:

  • 我需要與許多大的文件,因爲這些資源的工作,所以我想避免執行復制到不同的目錄。
  • 解決方案需要支持多種構建配置(調試,發佈等)。
  • 如果可能的話,我想避免前/後生成腳本,以保持簡單(低優先級)。

任何幫助將提前讚賞...謝謝。

回答

4

沒有這樣的財產存在。有更大的問題,這也需要在部署解決方案後才能工作。工作目錄不會是一個「解決方案」目錄,目標機器上沒有一個目錄。

假設工作目錄與EXE目錄相同,你的工作要好得多。這將是調試時和目標機器上的默認值。使用鏈接器設置,您可以完全控制EXE文件的位置。您可以通過獲取代碼中的EXE目錄來保護自己免受使用其他工作目錄運行程序的快捷方式的影響,以便生成絕對路徑。使用GetModuleFileName(),傳遞NULL以獲取EXE文件的路徑。

另一個標準的解決方案是將EXE需要的任何種類的資源複製到與構建輸出文件夾相關的文件夾中。你這樣做了預生成事件,使命令行類似於此:

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

注意/ d選項如何確保複製如果測試文件夾中的內容發生變化時才進行。

+0

複製資源:這樣做會訣竅,但是我擁有大量的資源來複制(在這種情況下是大型測試向量),而且每次複製這些資源都會浪費時間和內存。此外,我有多個構建配置(發佈,調試,...),這將導致進一步的重複,我希望避免。因爲這些數據被多個項目(以不同的方式)使用,所以這些向量在根目錄「解決方案」目錄中是合理的。另外,我想在解決方案的文件列表中維護順序(關於目錄結構)。 – scooz 2010-06-20 13:19:58

+0

另一方面,將可執行結果複製到根目錄解決方案目錄不僅會導致根目錄混亂,而且不能正確支持多個生成配置(將覆蓋同名文件等)。 看來,出於調試目的,最合理的事情是改變工作目錄。關於你提出的部署問題(我同意),我寧願把它比調試時複雜(因爲我調試的次數少於我的調試) – scooz 2010-06-20 13:23:05

+0

這就是爲什麼我指出了xcopy/d選項的行爲。你只支付一次副本。 – 2010-06-20 13:25:20

0

我不知道這是否是可能的,因爲用戶可能沒有足夠的權限訪問和讀/寫的目錄,我想VS檢查,如果用戶訪問一個目錄時,你選擇了它這可能是爲什麼只是一個基於賬戶的選項。

1

您可能會考慮使用「配置屬性/常規/輸出目錄」或「配置屬性/鏈接器/輸出文件」,而不是「調試器/工作目錄」設置。這些設置是每個項目而不是每個用戶,並且如果您保持工作目錄完好,則此是應用程序工作目錄的默認值。

+0

如果事情不走我的路,我可能會走這條路,儘管我的意志,以避免這種情況(見漢斯帕桑特的回答我的意見)。在以前版本的Visual Studio(例如2005)中,這種行爲不同嗎? – scooz 2010-06-20 13:24:51

10
  1. 配置您的調試設置像往常一樣(設置工作目錄,設置參數等),但只使用相對路徑,變量。請勿使用絕對路徑,如D:\ MyProject \ libs
  2. 保存您的解決方案,然後關閉Visual Studio
  3. 轉到您的項目目錄,並找到PROJECT.vcproj.COMPUTERNAME.USER.user
  4. 重命名PROJECT.vcproj.user(該文件將成爲通用的調試配置,您可以將其提交來源控制)
  5. 打開Visual Studio,如果需要,可以在調試設置中額外添加。 (額外的信息將被存儲在PROJECT.vcproj.COMPUTERNAME.USER.user文件,該文件是專門針對你的。需要注意的是PROJECT.vcproj.COMPUTERNAME.USER.user將覆蓋繼承的配置)

樣本項目。 vcproj.user文件中提供以下

<?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

您似乎可以刪除所有除了WorkingDirectory之外的屬性,如果這是您想要爲其設置默認值的唯一屬性 – Joe 2011-05-23 19:54:24