首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在执行生成的项目之前使Visual复制文件

如何在执行生成的项目之前使Visual复制文件
EN

Stack Overflow用户
提问于 2018-02-06 16:23:41
回答 1查看 1.3K关注 0票数 1

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

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

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

我不想将引擎项目中的依赖项添加到游戏项目中,因此我不能使用引擎项目中的后期构建脚本来完成这个任务。

我还通过VS中的调试->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. 一切正常工作,引擎代码被推送到引擎回购,游戏代码被推到游戏回购,以及开发人员错误地认为是最新的引擎库文件。
  6. 游戏回购现在处于一种状态,它不能在没有引擎项目访问的情况下运行。

TL;DR:

我可以(最好是通过Visual或CMake )在项目通过Visual启动时触发一组文件的副本吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-11 20:49:21

把我的评论变成一个答案

你的问题

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

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

这可以通过一些简单的测试代码进行测试(直到附加了调试器,然后触发一个断点):

main.cpp

代码语言:javascript
复制
#include <Windows.h>

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

CMakeLists.txt

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.4)

project(HelloWorld)

add_executable(HelloWorld "main.cpp")

start.ps1

代码语言:javascript
复制
.\HelloWorld.exe

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

代码语言:javascript
复制
Command:            C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Command Arguments:  -ExecutionPolicy Bypass -File $(ProjectDir)\start.ps1
Working Directory:  $(TargetDir)

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

start.ps1

代码语言:javascript
复制
Start-Process -FilePath "HelloWorld.exe"
Debug-Process -Name "HelloWorld

但是仍然需要选择要使用的调试器。也许 Visual Studio extension可以帮助自动化这个过程,或者您可以从Attach Debugger to multiple processes via powershell开始作为一个基础,但我还没有尝试过。

我以前用过的替代品。

我以前使用过两种简单的方法来使用外部DLL测试可执行文件(类似于您在问题中描述的场景):

  1. 将游戏项目的可执行输出路径设置为引擎项目的输出路径。因此,如果您开始调试,您将始终拥有最新的引擎库。 请参见CMAKE_RUNTIME_OUTPUT_DIRECTORY,它也可以从cmake命令行设置。制造-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=..。
  2. 将可执行文件的调试器Working Directory设置为引擎项目的输出路径。 参见VS项目的Configuration Properties / Debugging 或用于在CMake VS_DEBUGGER_WORKING_DIRECTORY目标属性中设置此属性。

不要在基于CMake的开源项目中使用“二进制传递”

问题还在于,为什么需要将库的(预)构建文件复制或部署到/使用可执行文件?

问题是您需要为"Platform + Compiler + Architecture + Configuration“交付库,以便使用CMake生成构建环境的所有可能的组合。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48647496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档