CMake FAQエントリ「静的ランタイムを使用してMSVCアプリケーションを構築するにはどうすればよいですか?」の指示に従っています。ネストされたCMakeプロジェクトの束のMSVCランタイムの選択を一元化する(それらはGitサブモジュールとして取り込まれ、CMakeの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を実行して、次のようなVisualStudioソリューションを生成します。
cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=dynamic
次の出力が得られます。
-- 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
ここで、Visual Studioを起動し、[C / C ++、コード生成]でプロジェクトのプロパティを調べると、[ランタイムライブラリ]設定がシェルに出力されたオプションと一致していないことがわかります。「Release」、「MinSizeRel」、「RelWithDebInfo」の構成で、期待どおりの結果が得られます(「マルチスレッドDLL / MD」ですが、「デバッグ」構成でも「マルチスレッド/ MT」と表示されます)。
また、静的にリンクされたランタイムを強制的に使用すると、同様の結果が得られます。私が走ったら
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
それでも、すべての構成で、「ランタイムライブラリ」設定の「マルチスレッド/MT」値が生成されます。
私は何を間違っているのですか、またはこれがCMake(2.8.7)などのバグである場合はどうなりますか?
Visual Studio 2010プロジェクトファイルを生成すると、「デバッグ」構成に対して異なる値が取得されますが、選択した値は取得されません。
いずれの場合も、設定は「デバッグ」構成では通常のフォントで表示されますが、他の構成では太字で表示され、これらがオーバーライドであることを示しています。さらに、XMLプロジェクトファイルを開くと、「Debug」構成には、「Name=VCCLCompilerTool」属性を持つ「Tool」要素の「RuntimeLibrary」属性の設定がないことがわかります。他のすべての構成には明示的な設定があります。