在VS2008中全局(不是每用户)更改“调试/工作目录”

时间:2010-06-20 11:56:34

标签: visual-studio-2008 visual-c++ projects-and-solutions

我在VS2008中有一个包含多个项目的C ++解决方案。此解决方案包含运行时所需的文件,这些文件是根据相对于解决方案目录的路径加载的(例如"Testing/data/" + "dataN.bin")。

为了使此解决方案有效,我必须在项目中设置工作目录设置,以便它指向解决方案目录(例如Configuration Properties >> Debugging >> Working Directory = $(SolutionDir))。当我在自己的电脑上调试时,这很好用。但是,当其他用户加载我的解决方案时,他的项目没有正确设置此属性。

我跟踪此设置不是存储在项目文件(PROJECT.vcproj)中,而是存储在为其创建的用户特定文件中(PROJECT.vcproj.DOMAIN.USER.user)。

我想为所有用户存储此设置的方法,而不必一次又一次地手动设置。

我的想法是:

  • 找到一种方法将其存储在.vcproj文件(不是用户特定的文件)或解决方案文件中。
  • 找到一种方法来创建“默认用户特定文件”,从中开始所有用户特定设置(并且可以稍后修改)。

但是,我没有办法做到这两种方法。

更多注释/限制:

  • 我需要使用许多大文件作为这些资源,因此我想避免将副本复制到不同的目录。
  • 解决方案需要支持多种构建配置(调试,发布等)。
  • 我想尽可能避免使用前/后构建脚本,以保持简单(低优先级)。

任何帮助将不胜感激......提前感谢。

4 个答案:

答案 0 :(得分:10)

  1. 像往常一样配置调试设置(设置工作目录,设置参数等...),但只使用相对路径,变量。不要使用像D:\ MyProject \ libs
  2. 这样的绝对路径
  3. 保存您的解决方案,然后关闭Visual Studio
  4. 转到您的项目目录,找到 PROJECT.vcproj.COMPUTERNAME.USER.user
  5. 将其重命名 PROJECT.vcproj.user (此文件将是通用调试配置,您可以将其提交给源代码管理)
  6. 打开Visual Studio ,如果需要,可以额外添加调试设置。 (额外信息将存储在特定于您的PROJECT.vcproj.COMPUTERNAME.USER.user文件中。请注意 PROJECT.vcproj.COMPUTERNAME.USER.user将覆盖继承的配置)
  7. 下面提供了示例PROJECT.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>
    

答案 1 :(得分:4)

不存在此类财产。存在更大的问题,在部署解决方案后,这也需要工作。然后,工作目录不会成为“解决方案”目录,目标计算机上没有目录。

假设工作目录与EXE目录相同,那么你的工作要好得多。这将是调试时和目标机器上的默认值。您可以使用链接器设置完全控制EXE文件的位置。并且您可以通过获取代码中的EXE目录来保护自己免受使用其他工作目录运行程序的快捷方式的影响,以便生成绝对路径。使用GetModuleFileName(),传递NULL以获取EXE文件的路径。

另一个标准解决方案是将EXE所需的任何类型的资源复制到与构建输出文件夹相关的文件夹中。您可以使用Pre-Build事件执行此操作,使命令行看起来类似于:

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

请注意/ d选项如何确保仅在测试文件夹内容发生更改时才进行复制。

答案 2 :(得分:1)

您可以考虑使用“配置属性/常规/输出目录”或“配置属性/链接器/输出文件”,而不是“调试器/工作目录”设置。这些设置是按项目而不是按用户设置的,如果您保持工作目录不变,则此是应用程序工作目录的默认值。

答案 3 :(得分:0)

我想知道这是否可行,因为用户可能没有足够的权限来访问和读/写目录,我想VS会检查用户是否有权访问目录,这可能就是为什么只有基于帐户的选项。