2012-04-11 11 views
31

में एमएसवीसी रनटाइम सेट करना मैं नेस्टेड सीएमके परियोजनाओं के समूह के लिए एमएसवीसी रनटाइम के चयन को केंद्रीकृत करने के लिए सीएमके एफएक्यू एंट्री "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" विशेषता के साथ कोई सेटिंग नहीं है। अन्य सभी विन्यासों में एक स्पष्ट सेटिंग है।

+0

महान समाधान! – mattiash

उत्तर

10

ऐसा लगता है कि मैं इस पर काम कर रहा था, मैं खराब सीएमके कॉन्फ़िगरेशन को हटाने के लिए भूल गया था जिसे मैं प्रतिस्थापित करने की कोशिश कर रहा हूं।

set(CMAKE_CXX_FLAGS_DEBUG 
    "/DWIN32 /D_WINDOWS /EHsc /WX /wd4355 /wd4251 /wd4250 /wd4996" 
    CACHE STRING "Debug compiler flags" FORCE 
) 

असल में, मैं के परिणामों अधिभावी था configure_msvc_runtime() निर्माण झंडे कि MSVC क्रम निर्धारित नहीं की थी के साथ मैक्रो द्वारा:

आगे का निर्माण स्क्रिप्ट नीचे, मैं इस छोटे से मैथुन छोड़ दिया था।

परेशानी के लिए खेद है!

+0

आपने वास्तव में स्थिर रनटाइम पुस्तकालयों को मजबूर करने के लिए अपने समाधान के साथ मुझे बचाया! – linello

5

मैंने अपना कोड लिया और इसे प्रत्येक मौजूदा कॉन्फ़िगरेशन के लिए काम करने के लिए सामान्यीकृत किया, न केवल डीबग/रिलीज/रिलीविथडेबइन्फो/मिनसाइजेल के लिए।

इसके अलावा, मैं यह जीसीसी के साथ काम करने के लिए बनाया भी - इसे देखें here

+0

क्या यह निर्दिष्ट करना संभव है (या अगर इसे पहले से निर्दिष्ट किया गया है तो ओवरराइड करें) कमांड लाइन से स्थिर या गतिशील सीआरटी लिंकिंग? तृतीय-पक्ष libs बिल्ड स्क्रिप्ट्स को संशोधित करने से बचने के लिए –

+0

@AndyT आप प्रॉक्सी CMakeLists.txt बना सकते हैं जो '' 'add_subdirectory 'तीसरे पक्ष के lib को' '' जोड़ता है - और आप रनटाइम सेट कर सकते हैं - लेकिन अगर तृतीय पक्ष lib सेट रनटाइम अपने आप पर है तो इसके लिए एक विकल्प होना चाहिए ... – onqtam