如何在执行构建项目之前制作Visual Studio副本文件

时间:2018-02-06 16:23:41

标签: visual-studio cmake visual-studio-2017 static-libraries

我正在开发游戏和单独的游戏引擎(静态库)。 游戏副本通过我在CMake中设置的预构建脚本包含游戏引擎项目和输出。

当我更改引擎中的代码并想要测试它时;我运行游戏项目。如果游戏项目不需要重新编译;来自引擎项目的新lib文件将永远不会被复制到游戏项目中(我已经在编译游戏项目之前设置了用于复制的预构建事件),因此在我运行游戏时不会进行更改。

这很麻烦,并且在调试多次时误导我,因此我希望每次启动游戏项目时都会复制lib文件,以确保它们始终是最新的。

我不想将引擎项目中的依赖项添加到游戏项目中,因此我无法在引擎项目中使用构建后脚本来执行此操作。

我还研究了通过VS中的Debugging-> Comand项目设置运行.bat文件,就像他们在这里建议的那样:How to run some script\excutable befure start debugging in VS2015?

这仅适用于发布版本,因为调试器在通过.bat文件启动时不会附加。

我尝试用于启动生成的.exe的批处理代码是:

  • start Absolute/Path/To/Generated/File.exe
  • call Absolute/Path/To/Generated/File.exe
  • Absolute/Path/To/Generated/File.exe

我提出的唯一完全可行的解决方案是通过我的游戏项目的源代码执行脚本。我希望在源代码之外做到这一点,因为我希望能够将我的CMake复制到一个新项目并且已经解决了所有问题。

编辑:由于我的用例似乎有些混乱,我会进一步解释。我希望可以将游戏和引擎彼此分开,因此,游戏项目存储库具有引擎项目的输出库的副本。由于以下情况的可能性,我无法通过指向游戏项目中的引擎项目输出目录来100%解决问题:

  1. 对引擎代码进行了更改,并重新编译项目。
  2. 对游戏代码进行了更改,并重新编译了项目(用于复制lib文件的脚本触发器)。
  3. 再次对引擎代码进行更改,并重新编译项目。
  4. 测试引擎的变化时;游戏项目不需要重新编译(因此没有脚本触发并且不发生复制),并且它与引擎项目的输出目录中的新lib文件一起运行,以测试在两个项目中所做的更改。
  5. 一切正常,引擎代码被推送到引擎仓库,游戏代码被推送到游戏仓库以及开发人员错误认为是最新的引擎lib文件。
  6. 游戏仓库现在处于无法访问引擎项目的状态下运行。
  7. TL; DR:

    每次通过Visual Studio启动项目时,我能以某种方式(通过Visual Studio或CMake)触发一堆文件的副本吗?

1 个答案:

答案 0 :(得分:0)

将我的评论转化为答案

您的问题

我能够重现您的问题,不幸的是,即使在cmd这样的批处理文件(powershellAbsolute/Path/To/Generated/File.exe)中直接调用可执行文件也会创建一个新进程(这意味着您的调试器不会自动附加到这个新的/动态创建的进程。)

因此,没有简单的基于脚本的解决方案,允许在您开始调试(F5)"的时刻复制共享库依赖项。可执行文件。

这可以使用一些简单的测试代码进行测试(等到连接调试器然后触发断点):

<强>的main.cpp

#include <Windows.h>

int main()
{
    while (IsDebuggerPresent() == FALSE);
    DebugBreak();
}

<强>的CMakeLists.txt

cmake_minimum_required(VERSION 2.4)

project(HelloWorld)

add_executable(HelloWorld "main.cpp")

<强> start.ps1

.\HelloWorld.exe

配置属性/调试(VS项目)

Command:            C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Command Arguments:  -ExecutionPolicy Bypass -File $(ProjectDir)\start.ps1
Working Directory:  $(TargetDir)

现在您只能手动附加到新流程。我还尝试了以下powershell脚本:

<强> start.ps1

Start-Process -FilePath "HelloWorld.exe"
Debug-Process -Name "HelloWorld

但您仍需要选择要使用的调试器。可能ReAttach Visual Studio extension可能有助于自动化流程,或者您可以从Attach Debugger to multiple processes via powershell作为基础开始,但我还没有尝试过。

我之前使用过的替代品......

我之前用过的两种简单方法,用于测试带有外部DLL的可执行文件(类似于您在问题中描述的方案):

  1. 将游戏项目的可执行输出路径设置为引擎项目的输出路径。因此,如果您开始调试,您将始终拥有最新的引擎库。

    请参阅CMAKE_RUNTIME_OUTPUT_DIRECTORY,也可以从cmake命令行

    进行设置
    > cmake -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=.... 
    
  2. 将可执行文件的调试器Working Directory设置为引擎项目的输出路径。

    查看您的VS项目Configuration Properties / Debugging

    或者从CMake VS_DEBUGGER_WORKING_DIRECTORY目标属性

  3. 中进行设置

    不要使用&#34;二元交付&#34;在基于CMake的开源项目中

    问题还在于您需要将库的(预)构建文件复制或部署到可执行文件中吗?

    问题是您需要为&#34;平台+编译器+架构+配置&#34; 提供库,以便可以使用CMake为其生成构建环境。

    并且您至少还需要提供头文件(如果接口契约不是库本身的一部分,例如托管代码)。如果然后添加程序数据库.pdb文件,则还需要源文件能够调试到库中。这将总结为您完整的git包。

    一般情况下,我建议您阅读cmake-packages from CMake's doku,例如请查看"Code Review: Basic CMake C++ project structure"Making cmake library accessible by other cmake packages automatically