2010-06-20 57 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