2016-12-30 11 views
5

Mam ten prosty CUpewnij złożyćDlaczego CMake dodaje niepotrzebne biblioteki do projektu Visual Studio?

cmake_minimum_required(VERSION 2.8) 
project(test) 
set(SOURCES source.cpp) 
add_executable(test ${SOURCES}) 

gdzie source.cpp to prosty program Hello World. I następnie wygenerować projektu Visual Studio

cmake -G"Visual Studio 14 2015" ..\Sources 

Wygenerowany projekt Visual Studio posiada następujące biblioteki, pod 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 

Jeśli usunąć tych bibliotek mogę nadal skutecznie zbudować i uruchomić świat Halo.

Dlaczego CMake dodaje wszystkie te biblioteki i co mogę zrobić, aby nie mieć ich w moich projektach?

+4

Są to wszystkie standardowe biblioteki systemu operacyjnego Windows (które łączą się z jądrem systemu Windows, użytkownikiem i bibliotekami DLL GDI). Wiele (większość) z nich jest wymaganych dla dowolnej aplikacji Windows, która robi cokolwiek więcej niż napisanie * Hello, world * do konsoli. –

+0

@KenWhite OK, ale jeśli są potrzebne, dlaczego nadal mogę uruchomić mój projekt bez łączenia ich? – Ali

+2

Ponieważ piszesz prostą aplikację * Hello world *, prawdopodobnie. –

Odpowiedz

2

Zgodnie z komentarzem @Vertexwahn są to wartości domyślne zdefiniowane w CMake przez CMAKE_CXX_STANDARD_LIBRARIES_INIT w CMakeCXXInformation.cmake.

Chciałem tylko dodać prosty AdditionalDependencies makro wymiana znaleźć here:

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) 
... 

Referencje

+0

Wow, bardzo miło. Nie wiedziałem o "CMAKE_USER_MAKE_RULES_OVERRIDE". Czy możesz również dodać link do tego, co robi '[= ['/'] =]'? – Ali

+1

@Ali Ta część nazywa się [Argument bracket] (https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#bracket-argument) i zajmuje po prostu wszystko między '[= ['/'] =] 'nawiasy as-is (w tym wcięcia i znaki nowej linii). Używam ich, jeśli np. bezpośrednio chcesz zapisać zawartość innego pliku tekstowego. – Florian