1

情况

去年我学到了很多东西,但这是我无法理解的。项目是C++. 制作1.15.2。视觉工作室2015

我使用cmake-converter转换了整个解决方案*.sln文件,并为文件中定义的所有外部 s编写了 FindXXX.cmake 模块。*.lib*.vcxproj

每次我遇到一个我都会在调用中error: unresolved external添加相应的目标。Sometarget::somecomponenttarget_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 库并将其添加到调用的源中ConsumingTargetSometarget::somecomponenttarget_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
  • 关于导入目标的另一种解释以及如何在不需要.dlls 的地方链接库。
  • 关于如何分析/比较两个二进制文件的符号(?)并将看到的信息映射到 CMake 命令的说明。(我正在使用DependenciesGui.exe在 .exe 文件中查找依赖项)

失败的可能原因

编辑:1:添加了失败的可能原因

4

0 回答 0