【问题标题】:How to prevent CMake from explicitly linking system libraries?如何防止 CMake 显式链接系统库?
【发布时间】:2022-08-24 23:10:28
【问题描述】:

我将以CMake\'s example project 为例。所以我有这个:

cmake_minimum_required(VERSION 3.10)

# set the project name
project(Tutorial)

# add the executable
add_executable(Tutorial tutorial.h)

set_target_properties(Tutorial PROPERTIES LINKER_LANGUAGE CXX)

生成解决方案后,当我在 Visual Studio 中打开解决方案并转到 Project Properties - Configuration Properties - Linker - Input - Additional Dependencies 时,我看到它链接了很多库:

我想阻止 user32.lib 链接这个特定的项目(不是解决方案中的每个项目)。我尝试谷歌搜索并找到了这个线程:How to avoid linking to system libraries。但我找不到解决方案。

我想这样做的原因是因为我试图不在我的测试项目中链接 user32.lib,所以我可以使用链接替换(也称为链接接缝)技术来提供我自己的在测试项目中实现,模拟系统调用,以便能够测试执行这些系统调用的类。 它已经有效:我在 Visual Studio 的项目属性中删除了库(并将其添加到 Ignore Specific Default Libraries 属性的列表中),但问题是每次重新生成解决方案时,链接图书馆得到恢复。

    标签: c++ windows cmake


    【解决方案1】:

    发布这个问题和答案是因为我在谷歌上找不到解决方案,而且似乎没有。

    好的,所以要解决这个问题,我需要做的就是:

    SET(CMAKE_CXX_STANDARD_LIBRARIES "")
    

    就是这样!

    即使在设置了这一行之后,仍然会加载该列表中的所有默认库,如 kernel32、user32 和其他库,因为它们都是默认库列表和 Windows 的一部分

    即使设置了这条线,整个解决方案仍然有效:它实际上仍然链接所有这些库,因为%(附加依赖)从父级或项目默认值继承复选框:

    现在要从我的项目链接中实际排除 user32.lib,我这样做: SET_TARGET_PROPERTIES(${MY_PROJECT_NAME} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:User32.lib")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-04
      • 2015-01-15
      • 1970-01-01
      • 2013-02-17
      • 2018-07-06
      • 2022-01-15
      • 2021-10-24
      相关资源
      最近更新 更多