为什么CMake为Visual Studio项目添加了不必要的库?

Ali*_*Ali 6 cmake visual-studio

我有这个简单的CMake文件

cmake_minimum_required(VERSION 2.8)
project(test)
set(SOURCES source.cpp)
add_executable(test ${SOURCES})
Run Code Online (Sandbox Code Playgroud)

其中source.cpp是一个简单的hello world程序.然后我生成Visual Studio项目

cmake -G"Visual Studio 14 2015" ..\Sources  
Run Code Online (Sandbox Code Playgroud)

生成的Visual Studio项目具有以下库Configuration Properties > Linker > Input > Additional Dependencies:

kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib
Run Code Online (Sandbox Code Playgroud)

如果我删除这些库,我仍然可以成功构建并运行hello world.

为什么CMake会添加所有这些库,我可以做些什么来在我的项目中没有它们?

Flo*_*ian 4

CMAKE_CXX_STANDARD_LIBRARIES_INIT正如 @Vertexwahn 所评论的,这些是 CMake中定义的默认值CMakeCXXInformation.cmake

我只是想添加一个简单的AdditionalDependencies替换:

cmake_minimum_required(VERSION 3.0)

file(
    WRITE "${CMAKE_BINARY_DIR}/MakeRulesOverwrite.cmake"
[=[
    if (MSVC)        
        set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "%(AdditionalDependencies)")
    endif()
]=]
)
set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_BINARY_DIR}/MakeRulesOverwrite.cmake")

project(test)
...
Run Code Online (Sandbox Code Playgroud)

参考

  • @Ali这部分称为[括号参数](https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#bracket-argument)并且只接受`[=[之间的所有内容`/`]=]` 按原样括起来(包括缩进和换行符)。如果我想直接写入另一个文本文件的内容,我会使用它们。 (3认同)