2009-10-24 16 views
6

मैं सीएमके बिल्ड सिस्टम और माइक्रोसॉफ्ट के विजुअल सी ++ कंपाइलर का उपयोग कर एक फाइल बना रहा हूं। जब मेरे पास सीएमके विजुअल स्टूडियो प्रोजेक्ट उत्पन्न करता है, तो प्रोजेक्ट में "मल्टी थ्रेडेड डीएलएल" रनटाइम का निर्माण करने के लिए कमांडलाइन होती है - एक जो msvcrt.dll पर निर्भर करता है। विभिन्न कारणों से मैं अभी नहीं जा रहा हूं, मैं msvcrt पर निर्भर नहीं हो सकता।सीएमके, माइक्रोसॉफ्ट विजुअल स्टूडियो, और मोनोलिथिक रनटाइम

क्या सीएमके को इसकी निर्माण प्रक्रिया में इस विकल्प को संशोधित करने का कोई तरीका है?

उत्तर

12

मैं स्थिर सीआरटी से जोड़ने के लिए कोड का निम्न भाग का उपयोग करें:

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

यह ओवरकिल नहीं है? "Foreach() स्ट्रिंग (प्रतिस्थापित,/md,/mt) endforeach()" काम भी नहीं करेगा? (यानी अगर() और/एमडीडी से छुटकारा पाएं। पहले प्रतिस्थापन वैसे भी दूसरे से मेल खाएगा, और प्रतिस्थापन करने से पहले एक मैच की खोज करने का कोई मतलब नहीं है। – brofield

+0

मेरे लिए काम करता है, foreach (flag_var ...): 'स्ट्रिंग (रेगेक्स रीप्लेस"/एमडी ""/एमटी "$ {flag_var}" $ {$ {flag_var}} ") –

+1

ऐसा करने के विकल्प http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees – javacavaj

2

मैं स्थिर झंडे (/ मीट्रिक टन और/MTD) के साथ गतिशील झंडे (/ एमडी और/MDD) की जगह। साथ ही, मैंने पाया कि मुझे छड़ी के लिए ध्वज चर को कैश करने की आवश्यकता है।

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() 
संबंधित मुद्दे