21

C ランタイムの動的バージョンを使用していくつかのターゲットを構築し、静的バージョンを使用して他のいくつかのターゲットを構築したい CMakeLists があります。

これはターゲットごとに設定する必要があるため、デフォルトの設定方法はCMAKE_CXX_FLAGS_<Config>機能しません。これはすべてのターゲットに対してオーバーライドされます。

そのために、次のようなことを試しました。

# @fn       set_target_dynamic_crt
# @brief    Sets the given target to use the dynamic version of the CRT (/MD or
#           /MDd)
# @param    ...  A list of targets to which this setting should be applied.
function( set_target_dynamic_crt )
    if ( MSVC )
        message (WARNING ${CMAKE_BUILD_TYPE})
        if (CMAKE_BUILD_TYPE STREQUAL "Debug")
            set_target_properties ( ${ARGN} PROPERTIES COMPILE_FLAGS "/MDd" )
        else()
            set_target_properties ( ${ARGN} PROPERTIES COMPILE_FLAGS "/MD" )
        endif()
    endif()
endfunction()

ただし、これは常にリリース バージョン ( /MD) を選択し、ビルド タイプ (message上記の呼び出し) を照会すると、空の文字列が返されます。(これは、私が Visual Studio ジェネレーターを使用しているためだと思われます。CMAKE_BUILD_TYPEメイクファイル専用であるというリファレンスを複数見てきました...)

ターゲットごとにこのようなコンパイル オプションを設定するにはどうすればよいですか?

4

4 に答える 4

39

CMake 2.8.12 では、このニーズに対応するために target_compile_options コマンドを追加しました。

http://public.kitware.com/Bug/view.php?id=6493

http://www.cmake.org/cmake/help/git-master/manual/cmake-generator-expressions.7.html

target_compile_options(tgt PRIVATE "/MD$<$<CONFIG:Debug>:d>")

見る

http://www.cmake.org/cmake/help/git-next/manual/cmake-buildsystem.7.html#build-specification-with-generator-expressions

CMAKE_BUILD_TYPE に関連する詳細と、ジェネレータ式が優れているいくつかの理由 (例: IMPORTED ターゲット構成マッピング)。

于 2014-01-05T03:28:17.410 に答える
2

このシナリオで私が知っている唯一のオプションは、プロジェクトをターゲットごとにサブディレクトリに分割し、add_subdirectory.

プロジェクトが現在どのように設定されているかによっては、これは骨の折れるプロセスになると思います。

結果は、次のようなトップレベルの CMakeLists.txt になります。

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)
add_subdirectory(libB)
add_subdirectory(libA)
add_executable(main_exe "main.cpp")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
target_link_libraries(main_exe lib_a lib_b)

次に、指定してフラグを立てるlibA/CMakeLists.txtことができます:MDMDd

project(LibA)
add_library(lib_a a.cpp a.hpp)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")

およびlibB/CMakeLists.txtforMTフラグMTd:

project(LibB)
add_library(lib_b b.cpp b.hpp)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

もちろん、多くのターゲットがある場合は、静的 CRT にリンクする必要があるすべてのターゲットを 1 つのサブディレクトリに追加し、CMakeLists.txt とすべての動的 CRT を別のサブディレクトリに追加できます。

于 2012-04-17T23:43:59.260 に答える
0

CMAKE_BUILD_TYPE単一構成ジェネレーターに対してのみ有効です。マルチ構成ジェネレーター (MSVC および Xcode) は、1 つのビルド ディレクトリで複数の構成用にビルドできるため、CMAKE_BUILD_TYPEフラグには意味がありません。

COMPILE_FLAGSターゲット プロパティは、異なる構成を区別しません (詳細については、キットウェア バグトラッカーを参照してください)。

回避策は、人々が Makefile ジェネレーターを使用する方法と同様に、2 つのビルド ディレクトリを用意し、配布用のバイナリをビルドするときに追加のフラグを定義することです。(つまり、リリース構成)

于 2012-04-17T22:17:35.817 に答える
0

vmovq_n_u8.c にオプションを追加-Onし、vmovq_O3.out と vmovq_O0.out を生成するとします。私はtarget_compile_options次のようにしてそれをやりました:

add_executable(vmovq_O3.out vmovq_n_u8.c)
add_executable(vmovq_O0.out vmovq_n_u8.c)

target_compile_options(vmovq_O3.out PRIVATE -O3)
target_compile_options(vmovq_O0.out PRIVATE -O0)

于 2019-11-12T12:06:10.997 に答える