'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 :
: Sonraconfigure_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.
Büyük çözümü bunu kontrol -
Ayrıca ben de gcc ile çalışmak yaptı! – mattiash