c++ - 如何在 Visual Studio 中正确设置我的构建后脚本

标签 c++ visual-studio build-script

因此,我目前正在尝试利用 Visual Studio 构建脚本从我的 exe 中构建一个 .lib 文件,正如本文接受的答案所建议的:Linking to multiple .obj for unit testing a console application 。基本上,他们建议放置在我的项目的构建后事件中的构建后脚本是:

lib /NOLOGO /OUT:"$(TargetPath).lib" "$(ProjectDir)\$(Configuration)\*.obj"

这是我当前的目录结构:

-Solution
   - Project 
      -Source
         .cpp files
   - ProjectTester
   - Solution.sln

所以我的命令如下所示:

lib /NOLOGO /OUT:"$(TargetPath).lib" "$(ProjectDir)\Source\*.obj"

目前这没有任何作用,就好像 Visual Studio 完全忽略了这个构建脚本一样。我的问题是:

$(TargetPath).lib 到底解析为什么?

我目前对此构建脚本的理解是否正确?如果是这样,我如何更改此脚本以执行我想要的操作?

更新:

我更改了目标路径中的一些空格,现在收到 LNK1146 no argument specified with option/OUT: 错误。

最佳答案

您没有提及您正在使用的 Visual Studio 版本。根据内存,答案不会有太大变化,但我会回答 Visual Studio 2015,因为这是我方便的。

探索适用于所有 Visual Studio 版本的宏值的一种方法是使用 ECHO 命令。将您的构建后脚本更改为

echo TargetPath: "$(TargetPath)"

并且当您构建项目时,您应该能够在“输出”窗口中读取宏的值。然而,在大多数现代版本的 Visual Studio 中,Echo 技巧并不是必需的。

构建后事件属性页中,单击命令行字段末尾的下拉列表,然后单击<编辑...>。在 Visual Studio 2015 中,随后的对话框将显示命令行和计算值,以便您可以看到展开了宏的命令行。

还有宏>>按钮。单击该按钮,您将看到一个对话框,其中显示每个宏名称及其值。列表顶部的文本框可让您将结果过滤为包含字符序列的结果。

$(TargetPath) 描述 here为“构建的主输出文件的绝对路径名(定义为驱动器 + 路径 + 基本名称 + 文件扩展名)”。这真正的含义是常规上的输出目录目标名称目标扩展属性的值属性页。

LIB 工具描述 here 。要获取有关 LIB 运行的更多信息,您可以添加/VERBOSE 选项。您还可以删除/NOLOGO 选项,这样您至少可以确认您正在运行 LIB(并且运行正确版本的 LIB)。

很难说出“什么都不做”的真正含义。我猜想最有可能的失败要么是正在创建 lib 文件,但不是在您期望的位置;或者 $(ProjectDir)\Source 中没有 obj 文件。

探索后一种情况的一种方法是将构建后事件更改为

dir "$(ProjectDir)\Source\*.obj"

然后检查构建输出以查看是否列出了 obj 文件。如果目录中没有 .obj 文件,输出窗口将显示类似的内容

1>   Directory of C:\TestPrograms\vc.net.2015\VCConsole
1>
1>  File Not Found

错误列表窗口将显示 dir 命令已退出,代码为 1。

关于c++ - 如何在 Visual Studio 中正确设置我的构建后脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43035979/

相关文章:

c++ - 如何使用 Visual Studio 2005 设置 Google C++ 测试框架 (gtest)

c# - 在 C# 中,有没有办法将同一类中的代码分离到不同的文件中?

java - 使用尽可能多的共享代码为 Java ME 和 Java SE 编写 Java 库

C++跨平台控制台应用程序,如何接受用户输入的运行时命令?

visual-studio - 为什么 Visual Studio 在自动热键之前捕获关键事件?

c++ - 在 Gnome 或 KDE 中以编程方式在桌面上移动应用程序窗口

android - 找不到 com.android.tools.build :gradle:7. 3.3。在 build.gradle 文件中发现错误,请帮助我

javascript - 没有 NodeJS 的 Typescript 命令行编译

c++ - C/C++ 是否提供最短执行时间的任何保证?

c++ - EqualityComparable 特质解释