2009-10-24 39 views
6

Tôi đang xây dựng một tệp bằng cách sử dụng Hệ thống Xây dựng CMake và trình biên dịch Visual C++ của Microsoft. Khi tôi có CMake tạo ra dự án studio trực quan, dự án có chứa dòng lệnh để xây dựng một kiểu "Multi Threaded DLL" của thời gian chạy - một trong đó phụ thuộc vào msvcrt.dll. Vì nhiều lý do tôi không đi vào ngay bây giờ, tôi không thể phụ thuộc vào msvcrt.CMake, Microsoft Visual Studio và Monolithic Runtimes

Có cách nào để yêu cầu CMake sửa đổi tùy chọn này trong quá trình xây dựng không?

Trả lời

12

tôi sử dụng đoạn mã sau để liên kết đến CRT tĩnh:

if(MSVC) 
# We statically link to reduce dependencies 
foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 
    if(${flag_var} MATCHES "/MD") 
     string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 
    endif(${flag_var} MATCHES "/MD") 
    if(${flag_var} MATCHES "/MDd") 
     string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}") 
    endif(${flag_var} MATCHES "/MDd") 
endforeach(flag_var) 
endif(MSVC) 
+3

Đây là quá mức cần thiết phải không? Sẽ không "foreach() chuỗi (thay thế,/md,/mt) endforeach()" làm việc chỉ là tốt? (ví dụ: loại bỏ if() và/MDd). Thay thế đầu tiên sẽ phù hợp với thay thế thứ hai, và không có điểm tìm kiếm một trận đấu trước khi bạn chỉ làm thay thế. – brofield

+0

Làm việc cho tôi, bên trong foreach (flag_var ...): 'chuỗi (REGEX REPLACE"/MD ""/MT "$ {flag_var}" $ {$ {flag_var}} ")' –

+1

Các tùy chọn để thực hiện việc này được ghi lại trong "Làm thế nào tôi có thể xây dựng ứng dụng MSVC của tôi với thời gian chạy tĩnh" tại http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees – javacavaj

2

tôi thay thế cờ năng động (/ MD và/MDD) với cờ tĩnh (/ MT và/MTD). Ngoài ra, tôi thấy rằng tôi cần phải lưu trữ các biến cờ để nó được gắn bó.

if(MSVC) 
    foreach(flag_var CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO) 
     string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 
     string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}") 
    endforeach(flag_var) 
    SET (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "MSVC C Debug MT flags " FORCE)  
    SET (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "MSVC CXX Debug MT flags " FORCE) 
    SET (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}" CACHE STRING "MSVC C Release MT flags " FORCE) 
    SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}" CACHE STRING "MSVC CXX Release MT flags " FORCE) 
    SET (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}" CACHE STRING "MSVC C Debug MT flags " FORCE)  
    SET (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}" CACHE STRING "MSVC C Release MT flags " FORCE) 
    SET (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" CACHE STRING "MSVC CXX Debug MT flags " FORCE)  
    SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" CACHE STRING "MSVC CXX Release MT flags " FORCE) 
endif() 
Các vấn đề liên quan