如何在目标

时间:2017-06-22 12:11:25

标签: visual-studio visual-c++ cmake dependencies circular-dependency

我有一个可执行文件(游戏引擎)导出符号(我使用set_target_properties(game PROPERTIES ENABLE_EXPORTS ON))。

我有一堆链接到该可执行文件的插件:

foreach(plugin ${PLUGINS})
    target_link_libraries(${plugin} game)
endforeach()

可执行文件使用LoadLibrary / dlopen动态加载它们。

当我在Visual Studio中按F5并开始游戏时,我不会重建已更改的插件,因为游戏不依赖于它们 - 反之亦然。

我想做以下事情:

foreach(plugin ${PLUGINS})
    add_dependencies(game ${plugin})
endforeach()

但它引入了每个插件和游戏之间的循环依赖关系。我怎样才能解决我的F5问题?

1 个答案:

答案 0 :(得分:2)

那是一个鸡蛋和鸡蛋"问题,因为game构建将生成plugin所需的导入库。因此,您无法在plugin之前构建game

我已尝试过您的方案,

  1. 如果我在POST_BUILD步骤中强制重建,我显然会得到一个递归构建调用:

    add_custom_command(
        TARGET game 
        POST_BUILD 
            COMMAND ${CMAKE_COMMAND} --build . --target ALL_BUILD --config $<CONFIG>
    )
    
  2. 如果我构建一个单独的目标作为&#34;跑步者&#34;目标,我可能会混淆其他人使用我的项目:

    file(WRITE nobuild.cpp "")
    add_executable(game_runner nobuild.cpp)
    
    set_source_files_properties(nobuild.cpp PROPERTIES HEADER_FILE_ONLY 1)
    set_target_properties(game_runner PROPERTIES OUTPUT_NAME "game")
    
    foreach(plugin ${PLUGINS})
        add_dependencies(game_runner ${plugin})
    endforeach()
    
  3. 因此,您重新使用ALL_BUILD目标的建议可能是最好的。要自动生成所需的.user设置,您可能会发现以下内容:

    CMake add_custom_target(): Run custom command using 'Debug->Start Debugging'

  4. 我已使用以下内容测试您的方案:

    project(TestPlugins)
    
    file(WRITE main.cpp "int main() { return 0; }")
    file(WRITE empty.cpp "")
    
    add_executable(game main.cpp)
    set_target_properties(game PROPERTIES ENABLE_EXPORTS ON)
    set_target_properties(game PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
    
    add_executable(plugin1 empty.cpp)
    add_executable(plugin2 empty.cpp)
    
    set(PLUGINS plugin1 plugin2)
    foreach(plugin ${PLUGINS})
        target_link_libraries(${plugin} game)
    endforeach()