Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非源文件更改时触发生成_C++_Visual Studio 2012_Lua_Cmake - Fatal编程技术网

C++ 非源文件更改时触发生成

C++ 非源文件更改时触发生成,c++,visual-studio-2012,lua,cmake,C++,Visual Studio 2012,Lua,Cmake,使用CMAKE,我添加了一个自定义命令,在LUA文件发生更改时,将其从源目录复制到输出目录。但是,只有当VisualStudio决定构建项目时才会触发此命令(尽管我对自定义命令使用了PRE_build)。VisualStudio只决定在源文件(本例中为c++)更改时生成,因此,当我仅更改LUA文件时,它们不会添加到输出目录 现在在VisualStudio中,我可以将LUA文件属性页中的“项类型”从“不参与构建”更改为“文本”。在这种情况下,VisualStudio确实会在只有LUA文件更改时触发

使用CMAKE,我添加了一个自定义命令,在LUA文件发生更改时,将其从源目录复制到输出目录。但是,只有当VisualStudio决定构建项目时才会触发此命令(尽管我对自定义命令使用了PRE_build)。VisualStudio只决定在源文件(本例中为c++)更改时生成,因此,当我仅更改LUA文件时,它们不会添加到输出目录

现在在VisualStudio中,我可以将LUA文件属性页中的“项类型”从“不参与构建”更改为“文本”。在这种情况下,VisualStudio确实会在只有LUA文件更改时触发生成。那么,如何确保CMAKE将正确的项目类型分配给LUA文件?(或者还有其他解决方案吗?)

CMakeLists.txt的相关部分

SET(LUA_Sources
  "lua/initialization.lua")

SOURCE_GROUP("lua" FILES ${LUA_Sources})

ADD_LIBRARY(engine 
  ${LUA_Sources})

foreach(LuaFile ${LUA_Sources})
  ADD_CUSTOM_COMMAND(
    TARGET engine
    PRE_BUILD
    COMMAND ${CMAKE_COMMAND}
    ARGS    -E 
      copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${LuaFile} ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile})
endforeach()
===========================

作为参考,该解决方案深受Angew的启发

SET(LUA_Sources
  "lua/initialization.lua")

SOURCE_GROUP("lua" FILES ${LUA_Sources})

set(LUA_Outputs "")
foreach(LuaFile ${LUA_Sources})
  list(APPEND LUA_Outputs ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile})   
endforeach()

add_custom_target(
  lua ALL
  DEPENDS ${LUA_Outputs}
  COMMENT "Copying LUA files"
  VERBATIM
)

foreach(LuaFile ${LUA_Sources})
  ADD_CUSTOM_COMMAND(
    TARGET lua
    COMMAND ${CMAKE_COMMAND}
    ARGS    -E 
      copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${LuaFile} 
endforeach()

我不得不稍微改变一下,因为如果文件更新,就不会一直复制。可能是因为ADD_CUSTOM_命令中的OUTPUT指令而不是我现在使用的TARGET指令。

如果CMakeList摘录完成,并且
引擎
目标仅被认为是复制Lua源的占位符,那么您将以错误的方式处理问题。您应该使用自定义命令+自定义目标组合,如下所示:

set(LUA_Sources
  "lua/initialization.lua")

source_group("lua" FILES ${LUA_Sources})

set(LUA_Outputs "")
foreach(LuaFile ${LUA_Sources})
  add_custom_command(
    OUTPUT ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile}
    COMMAND ${CMAKE_COMMAND}
    ARGS -E copy_if_different
      ${CMAKE_CURRENT_SOURCE_DIR}/${LuaFile}
      ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile}
  )
  list(APPEND LUA_Outputs ${EXECUTABLE_OUTPUT_PATH}/Debug/${LuaFile})
endforeach()

add_custom_target(
  engine ALL
  DEPENDS ${LUA_Outputs}
  COMMENT "Copying LUA files"
  VERBATIM
)

此CMakeList创建一个自定义命令来复制每个LUA文件,然后创建一个自定义目标,该目标将根据这些自定义命令的输出来驱动这些自定义命令。现在,依赖项跟踪将正常工作。

请显示您的应用程序的相关部分CMakeLists@Angew完成,我希望这有帮助。我不认为这太相关。我认为您的解决方案有错误。如果不同${CMAKE\u CURRENT\u SOURCE\u DIR}/${LuaFile}${EXECUTABLE\u OUTPUT\u PATH}/Debug/${LuaFile},那么最后一行不应该是
copy吗?文件不完整。引擎实际上是一个现有的目标,它还包含许多普通代码文件。我将它放在引擎项目中,以便在VisualStudio中,LUA文件显示在解决方案资源管理器中引擎项目下的正确位置。但是,让我看看是否可以修改您的示例:)。