【发布时间】:2018-02-06 16:23:41
【问题描述】:
我正在开发一款游戏和一个单独的游戏引擎(静态库)。 游戏副本包括游戏引擎项目并通过我在 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.execall Absolute/Path/To/Generated/File.exeAbsolute/Path/To/Generated/File.exe
我想出的唯一完全可行的解决方案是通过我的游戏项目的源代码执行脚本。我想在源代码之外执行此操作,因为我希望能够将我的 CMake 复制到一个新项目并且已经处理了所有问题。
编辑:由于我的用例似乎有些混乱,我将进一步解释。我希望可以将游戏和引擎彼此分开开发,因此,游戏项目存储库具有引擎项目输出库的副本。由于以下情况的可能,我无法通过在游戏项目中指向引擎项目的输出目录来100%解决问题:
- 更改引擎代码并重新编译项目。
- 更改游戏代码并重新编译项目(用于复制 lib 文件的脚本触发)。
- 再次更改引擎代码并重新编译项目。
- 测试引擎更改时;游戏项目不需要重新编译(因此不会触发脚本,也不会发生复制),它使用引擎项目输出目录中的新 lib 文件运行,以测试两个项目中所做的更改。
- 一切正常,引擎代码被推送到引擎存储库,游戏代码连同开发人员错误地认为是最新的引擎库文件一起被推送到游戏存储库。
- 游戏存储库现在处于无法访问引擎项目的情况下无法运行的状态。
TL;DR:
每次通过 Visual Studio 启动项目时,我能否以某种方式(最好通过 Visual Studio 或 CMake)触发一堆文件的副本?
【问题讨论】:
-
一个快速而肮脏的解决方案是将游戏项目的可执行输出路径设置为构建到引擎项目的输出路径中。因此,如果您开始调试,您将始终拥有最新的引擎库。而且我不明白为什么您的批处理文件方法不会附加到调试器,只要您不通过
start命令之类的方式在批处理中启动单独的进程。 -
@flor Heh,虽然没有那个解决方案:P 但它对我不起作用,因为涉及的项目比引擎多(没有提到它以保持它在我的题)。关于批处理文件解决方案;我根本不习惯批处理,所以我使用了 start (听起来这是一个糟糕的举动>.
-
@Florian 我现在也尝试使用 call 而根本没有命令(只是路径),它的行为方式与我的目的相同(调试器不会附加)。
-
能否将批处理脚本代码添加到您的问题中?还是生成解决方案项目还是使用VS2017新增的“打开文件夹”功能?而且我记得您必须将“配置属性/调试”下的“调试器类型”设置为特定值(我认为“混合”确实有效,取决于您的代码库是否在托管代码中)。
-
@Florian 我已经添加了用于启动 .exe 的行。我只需要让那部分工作,因为那时复制很简单。我还尝试摆弄您谈到的调试值,但无论我在那里选择什么都没关系(调试器从不附加到我的程序)。我的代码是非托管的,因为它都是 C/C++,我正在检查使用来自 WINAPI 的
IsDebuggerPresent()附加的编译器。我使用 CMake 生成了一个包含我的两个项目的解决方案。我不知道“打开文件夹”功能应该是什么,快速的谷歌让我失望了:/
标签: visual-studio cmake visual-studio-2017 static-libraries