【问题标题】:How to link debug executable with release library using CMake FetchContent?如何使用 CMake FetchContent 将调试可执行文件与发布库链接?
【发布时间】:2020-08-03 18:20:49
【问题描述】:

我想使用 FetchContent 将我的 Debug 可执行文件与 Release 版本中内置的外部库链接起来。 我可以使用以下方法将我的 Debug 可执行文件与 Debug 构建库和 Release 和 Release 类似:

project(CMakeDemo)
set(FETCHCONTENT_QUIET OFF)
FetchContent_Declare(
      ZLIB
      URL  https://zlib.net/zlib-1.2.11.tar.gz
    )
FetchContent_MakeAvailable(ZLIB)
    
add_executable(CMakeDemo main.cpp)
target_link_libraries(CMakeDemo ZLIB)

所以当我从 Windows 上的构建目录执行时:

cmake ../
cmake --build .

然后 zlib 和我的可执行文件在 Debug 版本中构建,我的可执行文件与该 zlib Debug 版本链接。

但是如何增强 CMake 以在 Debug 版本中构建我的可执行文件,但在 Release 版本中构建 zlib 并将我的 Debug 可执行文件与 zlib Release 版本链接? 如何使用 FetchContent_Declare 实现这一目标

(我相信这必须是一些常见的方法,因为例如当有人想在项目中使用 Google 测试框架或 zlib 时,他肯定想始终在发布版本中使用这些外部库)

【问题讨论】:

  • 如果这是与 Visual Studio 一起使用的,则不应混合调试和发布。 Debug 有自己的堆,与 release 不兼容。 debug和release在标准库的实现上也有区别。
  • cmake --build . --config Release 如果您不使用 Visual Studio,这可能是一个开始。

标签: c++ cmake


【解决方案1】:

FetchContent() 将在您的工作树中集成依赖项,这里是 ZLIB,就像 add_subdirectory() 这样标志将是相同的(如果 ZLIB 被正确配置为用作子项目,剧透:这不是您需要的情况修补它...)。

如果你真的想在 Release 中构建它,你应该尝试使用 ExternalProject()execute_process() 在配置时构建和安装它,然后你可以使用find_package() 来检索这个预安装的依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 2015-04-16
    • 2010-12-07
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多