我正在开发一个游戏和一个单独的游戏引擎(静态库)。游戏副本包括和输出的游戏引擎项目,通过一个预构建脚本,我已经设置在CMake。
当我在引擎中更改代码并想测试它时,我运行游戏项目。如果游戏项目不需要重新编译,那么引擎项目中的新库文件将永远不会被复制到游戏项目中(在编译游戏项目之前,我已经为复制设置了预构建事件),因此在运行游戏时不会发生更改。
这很烦人,并且在调试几次时误导了我,因此我希望每次游戏项目启动时都要复制lib文件,以确保它们始终是最新的。
我不想将引擎项目中的依赖项添加到游戏项目中,因此我不能使用引擎项目中的后期构建脚本来完成这个任务。
我还通过VS中的调试->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%地通过指向游戏项目中的引擎项目的输出目录来解决这个问题,因为可能出现以下情况:
TL;DR:
我可以(最好是通过Visual或CMake )在项目通过Visual启动时触发一组文件的副本吗?
发布于 2018-02-11 20:49:21
把我的评论变成一个答案
你的问题
我能够重现您的问题,不幸的是,即使像cmd或powershell这样的批处理文件中的可执行文件的直接调用也会创建一个新的进程(这意味着调试器不会自动附加到这个新的/动态创建的进程)。
因此,没有简单的基于脚本的解决方案允许在“开始调试(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但是仍然需要选择要使用的调试器。也许 Visual Studio extension可以帮助自动化这个过程,或者您可以从Attach Debugger to multiple processes via powershell开始作为一个基础,但我还没有尝试过。
我以前用过的替代品。
我以前使用过两种简单的方法来使用外部DLL测试可执行文件(类似于您在问题中描述的场景):
CMAKE_RUNTIME_OUTPUT_DIRECTORY,它也可以从cmake命令行设置。制造-DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=..。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
https://stackoverflow.com/questions/48647496
复制相似问题