情况
去年我学到了很多东西,但这是我无法理解的。项目是C++
. 制作1.15.2
。视觉工作室2015
。
我使用cmake-converter转换了整个解决方案*.sln
文件,并为文件中定义的所有外部 s编写了 FindXXX.cmake 模块。*.lib
*.vcxproj
每次我遇到一个我都会在调用中error: unresolved external
添加相应的目标。Sometarget::somecomponent
target_link_libraries(ConsumingTarget ... )
现在我有一个可以工作并且不会产生错误的构建。一些可执行文件会说以下内容:
“无法继续执行代码,因为找不到 somecomponent.dll……”
我有
.sln
生成只需要文件的可执行文件.lib
的原始文件- 生成需要文件
.sln
的可执行文件的 CMake 生成文件.dll
- 工作 FindXXX.cmake 文件
add_library(XXX::yyy UNKNOWN IMPORTED)
- 他们找到标题和
.lib
文件(.dll
文件在原始 VS 中不存在/预期/需要.sln
) .lib
他们为所有文件创建相应的目标
- 他们找到标题和
- 消费目标
target_link_libraries(ConsumingTarget PRIVATE XXX::yyy)
- “一个工作构建”
- “在启动主要功能之前”出现错误。
我试过的
我尝试定义一个 OBJECT 库并将其添加到调用的源中ConsumingTarget
并Sometarget::somecomponent
从target_link_libraries
调用中删除。对象库上的 CMake Doc
我尝试阅读和理解module 和 library之间的区别。即使是有关导入库的 CMake 文档也无法帮助我理解我的问题。
我尝试阅读并理解链接静态库和共享库之间的区别。
我的假设
- 添加导入的库是我做错的。
- 原因:DependenciesGui.exe显示 cmake-generated-executable 和 original-sln-executable 的不同依赖项,但链接器调用(在 VisualStudio 2015 中显示)似乎相同。
- 尽管在此答案中描述的所有级别都激活了标志,但 CMake 文件中的整个程序优化与原始 .sln 文件中的工作方式不同。
- 原因:使用我注意到的原始文件进行编译
warning C4505: 'foobar': unreferenced local function has been removed
- 我似乎没有在 cmake 生成的版本中收到这些警告。 - 子假设:不会调用的函数被优化掉,从而消除了
.dll
文件的必要性。
- 原因:使用我注意到的原始文件进行编译
我期待/希望
ConsumingTarget.exe
不求就跑somecomponent.dll
- 关于导入目标的另一种解释以及如何在不需要
.dll
s 的地方链接库。 - 关于如何分析/比较两个二进制文件的符号(?)并将看到的信息映射到 CMake 命令的说明。(我正在使用DependenciesGui.exe在 .exe 文件中查找依赖项)
失败的可能原因
- 一个可执行文件在使用 cmake-converter 转换后没有 /DELAYLOAD... 指令。打开的问题。问题标题仍然有效。
编辑:1:添加了失败的可能原因