visual-studio - 如何在目标之间创建人为的循环依赖

标签 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. 如果我在 POST_BUILD 步骤中强制重建,我显然会得到一个递归构建调用:

    add_custom_command(
        TARGET game 
        POST_BUILD 
            COMMAND ${CMAKE_COMMAND} --build . --target ALL_BUILD --config $<CONFIG>
    )
    
  2. 如果我构建一个单独的目标作为“运行者”目标,我可能会让使用我的项目的其他人感到困惑:

    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'


我使用以下内容来测试您的场景:

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()

关于visual-studio - 如何在目标之间创建人为的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44699100/

相关文章:

visual-studio - Visual Studio 中的托管代码

visual-studio-2010 - TeamCity 不编译 Visual Studio MS 测试项目

css - LESS - 从 URL 导入另一个文件

c++ - Windows 图形用户界面 C++ 编程

python - 动态加载库的 CMake 输出名称?

c# - Visual Studio 2015 添加服务引用

visual-c++ - fatal error LNK1179 : invalid or corrupt file: duplicate COMDAT '_IID_IXMLDOMImplementation'

c++ - 简单的拼接代码

compiler-errors - 安装ccons的CMake错误

c++ - cmake 在 macOS 下构建 llvm/clang 时出错