【问题标题】:Linking against a debug version of a library with CMake使用 CMake 链接库的调试版本
【发布时间】:2013-07-25 18:17:55
【问题描述】:

我在链接到我的库的调试版本时遇到了一些问题。我用 CMake 做一个库:

project(myLib)
...
add_library(myLib SHARED ${SOURCES})

我启动构建两次以获得我的库的发布和调试版本。然后我在调试库的名称中添加“d”后缀,并具有myLib.dllmyLibd.dll

在我的应用程序中,我明确链接到调试 dll:

project(myApp)
add_executable(myApp WIN32 ${SOURCES})
target_link_libraries(myApp myLibd.dll)

构建成功完成,但是当我使用 Dependency Walker 打开生成的 exe 文件时,我得到一个未解决的对 myLib.dll 文件的依赖关系,即使调试版本 (myLibd.dll) 位于同一文件夹中。

那么,为什么我的应用程序会在运行时尝试使用我的 lib 的发布版本?以及如何正确链接到调试版本?

【问题讨论】:

  • 你在使用 MinGW 吗?另外,如何将myLib.dll 重命名为myLibd.dll
  • 是的,我使用 MinGW。我在编译时手动重命名 lib 文件。

标签: c++ dll linker cmake


【解决方案1】:

您不应手动重命名文件。请改用 CMake 的 CMAKE_DEBUG_POSTFIX variableDEBUG_POSTFIX target property

add_library(myLib SHARED ${SOURCES})
set_target_properties(mylib PROPERTIES DEBUG_POSTFIX "d")

[...]
add_executable(myApp WIN32 ${SOURCES})
target_link_libraries(myApp myLib)

【讨论】:

  • 谢谢,成功了。所以我不能只是将我的 lib 文件重命名为我想要的任何内容并链接它们?
  • @hank 重命名 .lib 会使 CMake 感到困惑,但您仍然应该能够编译和运行该程序。另一方面,重命名 .dll 会导致麻烦,因为该名称是 hardcoded in the import lib file
  • @ComicSansMS 在Linux下怎么做?当我在发布模式下编译时,库是在运行时加载的。在调试模式下编译时,我收到“加载共享库时出错”消息。
  • @blackibiza DEBUG_POSTFIX 方法也应该适用于 Linux。您应该打开另一个问题,其中包含您遇到的问题的所有详细信息。
  • @ComicSansMS 是的,我的 RPATH 有问题,但现在解决了 :)
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多