如何在 visual studio 中正确设置我的 post-build 脚本
How to correctly setup my post-build script in visual studio
所以我目前正在尝试使用 visual studio 构建脚本从我的 exe 构建一个 .lib 文件,正如对此 post 的已接受答案所建议的:Linking to multiple .obj for unit testing a console application。基本上,他们推荐放置在我项目的 post-build 事件中的 post-build 脚本是:
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
命令。将您的 post-build 脚本更改为
echo TargetPath: "$(TargetPath)"
并且您应该能够在构建项目时在输出 window 中读取宏的值。然而,在 Visual Studio 的大多数现代版本中,Echo
技巧应该不是必需的。
在Post-Build Event 属性页面点击Command Line[=]末尾的下拉菜单 字段,然后单击 < 编辑...>。在 Visual Studio 2015 中,随后的对话框将向您显示命令行和评估值,以便您可以看到扩展了宏的命令行。
还有 宏>> 按钮。单击该按钮,您将看到一个对话框,显示每个宏名称及其值。列表顶部的文本框可让您将结果过滤为包含字符序列的结果。
$(TargetPath)
被描述为 here 为 "The absolute path name of the primary output file for the build (defined as drive + path + base name + file extension)"。这真正意味着 Output Directory、Target Name 和 Target Extension 属性的值常规 属性 页面。
描述了 LIB 工具 here。要获得有关 LIB 运行 的更多信息,您可以添加 /VERBOSE 选项。您也可以删除 /NOLOGO 选项,这样您至少可以确认您正在 运行正在使用 LIB(并且 运行正在使用正确版本的 LIB)。
很难说清 "does nothing" 的真正含义。我猜最有可能的失败是正在创建 lib 文件——但不是在您期望的位置;或者 $(ProjectDir)\Source 中没有 obj 文件。
探索后一种情况的一种方法是将您的 post-build 事件更改为
dir "$(ProjectDir)\Source\*.obj"
然后检查构建输出以查看是否列出了 obj 文件。如果目录中没有 .obj 文件,输出 Window 将显示类似于
的内容
1> Directory of C:\TestPrograms\vc.net.2015\VCConsole
1>
1> File Not Found
和错误列表 window 将显示 dir 命令以代码 1 退出。
所以我目前正在尝试使用 visual studio 构建脚本从我的 exe 构建一个 .lib 文件,正如对此 post 的已接受答案所建议的:Linking to multiple .obj for unit testing a console application。基本上,他们推荐放置在我项目的 post-build 事件中的 post-build 脚本是:
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
命令。将您的 post-build 脚本更改为
echo TargetPath: "$(TargetPath)"
并且您应该能够在构建项目时在输出 window 中读取宏的值。然而,在 Visual Studio 的大多数现代版本中,Echo
技巧应该不是必需的。
在Post-Build Event 属性页面点击Command Line[=]末尾的下拉菜单 字段,然后单击 < 编辑...>。在 Visual Studio 2015 中,随后的对话框将向您显示命令行和评估值,以便您可以看到扩展了宏的命令行。
还有 宏>> 按钮。单击该按钮,您将看到一个对话框,显示每个宏名称及其值。列表顶部的文本框可让您将结果过滤为包含字符序列的结果。
$(TargetPath)
被描述为 here 为 "The absolute path name of the primary output file for the build (defined as drive + path + base name + file extension)"。这真正意味着 Output Directory、Target Name 和 Target Extension 属性的值常规 属性 页面。
描述了 LIB 工具 here。要获得有关 LIB 运行 的更多信息,您可以添加 /VERBOSE 选项。您也可以删除 /NOLOGO 选项,这样您至少可以确认您正在 运行正在使用 LIB(并且 运行正在使用正确版本的 LIB)。
很难说清 "does nothing" 的真正含义。我猜最有可能的失败是正在创建 lib 文件——但不是在您期望的位置;或者 $(ProjectDir)\Source 中没有 obj 文件。
探索后一种情况的一种方法是将您的 post-build 事件更改为
dir "$(ProjectDir)\Source\*.obj"
然后检查构建输出以查看是否列出了 obj 文件。如果目录中没有 .obj 文件,输出 Window 将显示类似于
的内容1> Directory of C:\TestPrograms\vc.net.2015\VCConsole
1>
1> File Not Found
和错误列表 window 将显示 dir 命令以代码 1 退出。