2013-01-05 31 views
25

Tôi đang sử dụng lệnh cmake trên các cửa sổ bằng Windows SDK và NMake MakefilesBiên dịch CMake với/MT thay vì/MD

Theo mặc định, nó biên dịch bằng trình chuyển đổi trình biên dịch/MD.

Làm cách nào để thay đổi nó để biên dịch bằng nút chuyển/MT?

Trả lời

41

Bạn có thể thay đổi CMAKE_CXX_FLAGS_<Build Type> và/hoặc CMAKE_C_FLAGS_<Build Type> biến:

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") 
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 

Nếu cờ CMake của bạn đã chứa /MD, bạn có thể đảm bảo rằng các lệnh trên được thực hiện sau điểm mà tại đó /MD được chèn (việc thêm sau /MT ghi đè tùy chọn hiện tại xung đột) hoặc bạn có thể đặt cờ từ đầu:

set(CMAKE_CXX_FLAGS_RELEASE "/MT") 
set(CMAKE_CXX_FLAGS_DEBUG "/MTd") 
.210

Hoặc cách khác, bạn có thể thay thế /MD/MDd giá trị hiện có với /MT/MTd tương ứng bằng cách làm một cái gì đó như:

set(CompilerFlags 
     CMAKE_CXX_FLAGS 
     CMAKE_CXX_FLAGS_DEBUG 
     CMAKE_CXX_FLAGS_RELEASE 
     CMAKE_C_FLAGS 
     CMAKE_C_FLAGS_DEBUG 
     CMAKE_C_FLAGS_RELEASE 
     ) 
foreach(CompilerFlag ${CompilerFlags}) 
    string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") 
endforeach() 
+0

Cảm ơn! Điều đó hoạt động. Dù sao để loại bỏ cờ '/ MD' cũ? – Josh

+0

@Josh Tôi vừa cập nhật câu trả lời. Nếu nó vẫn không chính xác những gì bạn đang sau, hiển thị bit có liên quan của CMakeLists.txt của bạn và tôi chắc chắn sẽ có một câu trả lời gọn gàng. – Fraser

+0

@Josh Tôi đã thực hiện một lỗi nhỏ trong lệnh 'string (REPLACE ...)' - nó đã được sửa. – Fraser

0

thanh toán ucm_set_runtime - macro này sẽ thay thế những lá cờ cho runtime tĩnh hoặc động - để xem hiệu ứng sử dụng ucm_print_flags (cũng thanh toán this luồng ngăn xếp luồng)

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