15

$(TargetDirectory)Visual Studio 有诸如等宏$(OutputPath)
在我的源代码中,我想指定一个相对路径,用于从TargetDirectory.
目前我正在这样做:mLayer = mEngine->AddLayer("D:\\Projects\\abc.osg");我希望它像mLayer = mEngine->AddLayer(($TargetDirectory)+"..\\..\\abc.osg");

这只是一个临时要求,以便我可以将我的代码提供给某人进行小型演示,并且他的 TargetDirectory 与我的目录对齐方式不同。有没有办法在源代码中使用 Visual Studio 宏?(至少我知道系统环境变量是可以访问的)

4

6 回答 6

12

转到项目属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义并添加以下内容:

TARGET_DIRECTORY=LR"($(TargetDir))"

这定义了一个名为 TARGET_DIRECTORY 的宽字符串文字,其中包含 $(TargetDir) 宏的内容。这里重要的是,这会创建一个不将反斜杠视为转义字符的 C++ 原始字符串。路径包含反斜杠。使用常规字符串文字是不正确的,在某些情况下甚至会给您带来编译器错误。

重要的!

如果您使用的宏可能包含右括号,后跟双引号 )",则必须使用额外的分隔符,该分隔符不能出现在宏值中,例如:

TARGET_DIRECTORY=LR"|($(TargetDir))|"

在 Windows 文件系统路径的情况下,这不是必需的,因为路径不能包含双引号。

于 2014-10-08T23:46:56.907 回答
7

您不能自动执行此操作,但您可以将特定的 MSBuild 属性传递给预处理器:

<ItemDefinitionGroup>
  <ClCompile>
    <PreprocessorDefinitions>TARGET_DIRECTORY="$(TargetDirectory)"</PreprocessorDefinitions>
  </ClCompile>
</ItemDefinitionGroup>

这可以在 IDE 中进行配置,方法是转到 Project Property Pages 对话框,浏览到 Configuration Properties -> C/C++ -> Preprocessor Definitions,然后添加

TARGET_DIRECTORY="$(TargetDirectory)"

请注意,您使用+for 字符串文字连接是不正确的:字符串文字(以及一般的 C 字符串)不能使用+. 相反,字符串文字可以简单地通过将它们彼此相邻来连接。例如,

TARGET_DIRECTORY "..\\..\\abc.osg"
于 2013-02-15T05:00:46.693 回答
1

在 Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor 中,您可以添加指令。

PROJECT_DIR=R"($(ProjectDir))"

在代码中你可以使用它。

std::string com = "powershell groovy "PROJECT_DIR"generate_report.groovy " + EXE_DIR;

EXE_DIR在我们的例子中是一个字符串。

于 2020-01-06T12:56:43.870 回答
-1

我建议将这些与应用程序的工作目录或其他内容相关联。也许在http://msdn.microsoft.com/en-us/library/aa364934%28v=vs.85%29.aspx上查看 GetCurrentDirectory 函数。

于 2013-02-15T04:52:34.327 回答
-1

不是我知道的,但我有一个选择。

将您的文件部署为构建后步骤。在此步骤中,您可以使用代表二进制文件放置文件夹的 $(OutDir) 宏。这应该可以帮助您将此文件放置在您的应用程序的相对位置,并在您的代码中使用该相对位置。

这也将是一个持久的解决方案,而不是临时做的事情。

于 2013-02-15T04:56:07.657 回答
-1

使用 TARGET_DIRECTORY=""$(TargetDir)"" 代替 TARGET_DIRECTORY="$(TargetDir)" 字符串宏。(注意双引号)

在 VS2005 中为我工作。

于 2013-08-02T13:38:11.707 回答