CMake

2012-04-11 35 views
31

'da MSVC çalışma zamanını ayarlama CMake SSS girdisi "How can I build my MSVC application with a static runtime?"'daki yönergeleri izleyerek bir dizi iç içe yerleştirilmiş CMake projesi için MSVC çalışma zamanının seçimini merkezileştiriyorum (bunlar Git alt modülleri olarak çekilir ve ana projeye eklenir) CMake'in find_package() direktifi).CMake

Yani, bu CKağıt makro yazdım: Ben CMakeLists.txt (önce herhangiadd_library() veya add_executable() çağrı yapıldığında) benim kökünden başında bu makro çağırmak

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() 

ve hata ayıklama baskılar biraz ekleyin :

: Sonra

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 "") 

, ben CKağıt şöyle bir Visual Studio çözüm üretmek için çalışacak

ve ben şu çıkışları olsun:

-- 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 

Şimdi şey Visual Studio başlatmak ve "C/C++, Kod Üretimi" altında proje özelliklerini incelediğimizde, görüyorum ki " Çalışma Zamanı Kitaplığı "ayarı, kabukta basılan seçeneklerle tutarlı değil. "Release", "MinSizeRel" ve "RelWithDebInfo" yapılandırmalarının altında, beklenen sonuçları ("Çok iş parçacıklı DLL/MD") alırım, ancak "Hata ayıklama" yapılandırması hala "Çok iş parçacıklı/MT" görüntüler.

Ben statik bağlantılı çalışma zamanı kullanılmasını zorlamak Ayrıca, ne zaman, ben benzer sonuçlar elde Ben

cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=static 

aşağıdaki çıktılar elde çalıştırırsanız.

-- 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 

Ve

henüz tüm yapılandırmalar "multi üretmek "Runtime Library" ayarı için dişli/MT "değeri.

Birisi bana neyi yanlış yaptığımı söyler mi, yoksa bu CMake (2.8.7) veya benzeri bir hata mı? Ben Visual Studio 2010 proje dosyalarını oluşturmak Eğer, Ne değer için


, ben "ayıklama" yapılandırma için farklı bir değer elde, ama yine de olmayan bir ben seçilmiş. Her durumda, ayar, "Hata Ayıklama" yapılandırması için normal yazı tipinde görünürken, diğer yapılandırmalar için kalın yazı tipinde görünür, bunların geçersiz kılmalar olduğuna işaret eder. Ayrıca, XML proje dosyalarını açarsam, "Hata ayıklama" yapılandırmasının "Ad = VCCLCompilerTool" özniteliğiyle "Araç" öğesinin "RuntimeLibrary" özniteliği için bir ayarı olmadığını buldum. Diğer tüm yapılandırmaların açık bir ayarı vardır.

+0

Büyük çözümü bunu kontrol -

Ayrıca ben de gcc ile çalışmak yaptı! – mattiash

cevap

10

Üzerinde çalıştığım süre boyunca, değiştirmeye çalıştığım kötü CMake yapılandırmasını kaldırmayı unutmuşum gibi görünüyor.

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

Temelde, MSVC çalışma zamanını ayarlamak vermedi inşa bayraklarıyla makro configure_msvc_runtime() tarafından sonuçlarını baskın oldu:

Daha yapı komut aşağı, bu küçük bugger bırakmıştı.

Sorun için özür dilerim!

+0

Statik çalışma zamanı kitaplıklarını zorlamak için beni gerçekten çözümünüzle kurtardınız! – linello

5

Kodunuzu aldım ve yalnızca tüm Debug/Release/RelWithDebInfo/MinSizeRel için değil, her yapılandırma için çalışmaya genelleştirdim. here

+0

komut satırından bağlantı veren statik veya dinamik CRT belirtmek (veya önceden belirtilmişse geçersiz kılmak) mümkün mü? Sadece üçüncü taraf lib'leri değiştirmekten kaçınmak için betik oluşturmak –

+0

@AndyT bir '' add_subdirectory''' üçüncü taraf lib''' adlı bir proxy CMakeLists.txt yapabilir ve - orada çalışma zamanı ayarlayabilirsiniz - ancak üçüncü parti lib setleri Kendi başına çalışma zamanı o zaman bunun için bir seçenek olmalı ... – onqtam