【发布时间】:2017-11-25 17:10:18
【问题描述】:
我有一个导出符号的可执行文件(游戏引擎)(我使用过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 问题?
【问题讨论】:
-
如何在插件代码中使用导出的函数?如果你有硬编码的接口描述或者你有它在一个头文件中,那么只有从
plugin到game的间接依赖。那么,如果您只使用“game取决于plugin”变体会发生什么?从我的角度来看应该可以正常工作。 -
@Florian 好吧,我调用了引擎...几乎所有功能都从可执行文件中导出。我在插件中使用引擎头文件...“
plugin依赖于game”依赖项将继续存在。我想知道如何使 F5 工作流程也能正常工作...... -
如果我使用
getProcAddress而不是__declspec(dllimport)带注释的前向声明从插件访问引擎导出的所有内容,我可以删除“plugin取决于game”依赖项,但这不会'编码不实用...... -
我没有完全理解/理解这一点,但我想我找到了解决方案 - 我可以将
ALL_BUILD(由 CMake 创建)设置为启动项目(用于 F5)并设置这是运行可执行文件的命令 -
好吧,我忘了windows下需要先生成导入库,也就是说你需要在插件之前构建
game(因为导入库是静态链接的)。所以我已经用你的场景和 Visual Studio 运行了一些测试,并将结果放在答案中。
标签: visual-studio visual-c++ cmake dependencies circular-dependency