2016-12-30 18 views
5

tôi có nộp CMake đơn giản nàyTại sao CMake thêm các thư viện không cần thiết vào dự án Visual studio?

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

nơi source.cpp là một chương trình hello world đơn giản. sau đó tôi tạo ra các dự án Visual Studio

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

Dự án Visual Studio tạo ra có các thư viện sau, dưới 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 

Nếu tôi loại bỏ các thư viện này tôi vẫn có thể xây dựng thành công và chạy thế giới hello.

Tại sao CMake thêm tất cả các thư viện này và tôi có thể làm gì để không có chúng trong các dự án của mình?

+4

Đó là tất cả các thư viện Windows OS chuẩn (kết nối với Windows kernel, người dùng và GDI DLL). Nhiều (hầu hết) trong số đó là bắt buộc đối với bất kỳ ứng dụng Windows nào làm được gì hơn là viết * Xin chào, thế giới * đến bàn điều khiển. –

+0

@KenWhite OK, nhưng nếu cần thì tại sao tôi vẫn có thể chạy dự án của mình mà không liên kết chúng? – Ali

+2

Vì bạn đang viết đơn giản * Xin chào thế giới * ứng dụng, có lẽ. –

Trả lời

2

Như nhận xét của @Vertexwahn đó là các giá trị mặc định được xác định từ CMake theo số CMAKE_CXX_STANDARD_LIBRARIES_INIT trong CMakeCXXInformation.cmake.

Tôi chỉ muốn thêm một đơn giản AdditionalDependencies thay thế vĩ mô tìm thấy 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) 
... 

Tài liệu tham khảo

+0

Wow, rất hay. Không biết về 'CMAKE_USER_MAKE_RULES_OVERRIDE'. Bạn cũng có thể thêm liên kết đến những gì '[= ['/'] =]' không? – Ali

+1

@Ali Phần này được gọi là [Khung đối số] (https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#bracket-argument) và thực hiện mọi thứ giữa '[= ['/'] =] 'dấu ngoặc đơn là (bao gồm cả thụt đầu dòng và dòng mới). Tôi sử dụng chúng nếu tôi ví dụ trực tiếp muốn viết nội dung của một tệp văn bản khác. – Florian

Các vấn đề liên quan