में एमएसवीसी रनटाइम सेट करना मैं नेस्टेड सीएमके परियोजनाओं के समूह के लिए एमएसवीसी रनटाइम के चयन को केंद्रीकृत करने के लिए सीएमके एफएक्यू एंट्री "How can I build my MSVC application with a static runtime?" में निर्देशों का पालन कर रहा हूं (उन्हें गिट सबोड्यूल के रूप में खींचा जाता है और मास्टर प्रोजेक्ट में जोड़ा जाता है सीएमके का find_package()
निर्देश)।सीएमके
तो, मैं इस CMake मैक्रो लिखा है:
macro(configure_msvc_runtime)
if(MSVC)
# Default to statically-linked runtime.
if("${MSVC_RUNTIME}" STREQUAL "")
set(MSVC_RUNTIME "static")
endif()
# Set compiler options.
set(variables
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
if(${MSVC_RUNTIME} STREQUAL "static")
message(STATUS
"MSVC -> forcing use of statically-linked runtime."
)
foreach(variable ${variables})
if(${variable} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}")
endif()
endforeach()
else()
message(STATUS
"MSVC -> forcing use of dynamically-linked runtime."
)
foreach(variable ${variables})
if(${variable} MATCHES "/MT")
string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}")
endif()
endforeach()
endif()
endif()
endmacro()
मैं अपने रूट की शुरुआत CMakeLists.txt
(से पहले किसी भीadd_library()
या add_executable()
कॉल किया जाता है) पर इस मैक्रो फोन और डिबगिंग प्रिंट का एक छोटा सा जोड़ने :
configure_msvc_runtime()
set(variables
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
message(STATUS "Initial build flags:")
foreach(variable ${variables})
message(STATUS " '${variable}': ${${variable}}")
endforeach()
message(STATUS "")
फिर, मैं CMake इसलिए की तरह एक दृश्य स्टूडियो समाधान उत्पन्न करने के लिए चलाने के
और मैं निम्नलिखित आउटपुट मिलता है:
-- MSVC -> forcing use of dynamically-linked runtime.
-- Initial build flags:
-- 'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_C_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_CXX_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG
अब, बात यह है कि जब मैं दृश्य स्टूडियो शुरू करने और "C/C++, कोड पीढ़ी" के तहत परियोजना के गुण की जांच, मुझे लगता है कि देखते हैं " रनटाइम लाइब्रेरी "सेटिंग खोल में मुद्रित विकल्पों के अनुरूप नहीं है। "रिलीज", "मिनीसाइजरेल" और "रिलाविथडेबइन्फो" कॉन्फ़िगरेशन के तहत, मुझे अपेक्षित परिणाम मिलते हैं ("बहु-थ्रेडेड डीएलएल/एमडी", लेकिन "डीबग" कॉन्फ़िगरेशन अभी भी "मल्टी-थ्रेडेड/एमटी" प्रदर्शित करता है।
इसके अलावा, जब मैं स्थिर से जुड़े क्रम का उपयोग कराने के, मैं इसी तरह के परिणाम मिलता है, तो मैं चलाने
cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=static
मैं निम्नलिखित आउटपुट मिलता है:।
-- MSVC -> forcing use of statically-linked runtime.
-- Initial build flags:
-- 'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_C_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
-- 'CMAKE_C_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1
-- 'CMAKE_CXX_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
-- 'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG
और फिर भी सभी विन्यास का उत्पादन "मल्टी थ्रेडेड/एमटी "" रनटाइम लाइब्रेरी "सेटिंग के लिए मूल्य।
क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं, या यदि यह सीएमके (2.8.7) या कुछ में एक बग है?
क्या इसके लायक है, अगर मैं दृश्य स्टूडियो 2010 परियोजना फ़ाइलें उत्पन्न के लिए, मैं "डीबग" विन्यास के लिए एक अलग मूल्य मिलता है, लेकिन अभी भी नहीं एक मेरे द्वारा चुने गए। सभी मामलों में, सेटिंग "डीबग" कॉन्फ़िगरेशन के लिए नियमित फ़ॉन्ट में दिखाई देती है, जबकि यह अन्य कॉन्फ़िगरेशन के लिए बोल्ड फ़ॉन्ट में दिखाई देती है, जिससे संकेत मिलता है कि वे ओवरराइड हैं। इसके अलावा, अगर मैं एक्सएमएल प्रोजेक्ट फाइलें खोलता हूं, तो मुझे लगता है कि "डीबग" कॉन्फ़िगरेशन में "टूल" तत्व के "रनटाइम लाइब्रेरी" विशेषता "नाम = VCCLCompilerTool" विशेषता के साथ कोई सेटिंग नहीं है। अन्य सभी विन्यासों में एक स्पष्ट सेटिंग है।
महान समाधान! – mattiash