2012-04-17 22 views
12

我有一個CMakeLists,我想使用C運行時的動態版本和其他一些使用靜態版本的目標來構建一些目標。如何在使用CMake的特定構建配置中爲特定目標設置特定的編譯器標誌?

因爲這需要按目標設置,因此默認設置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僅適用於makefiles ...)

如何爲每個目標設置這樣的編譯選項?

+0

現在有一個比下面顯示的更好的解決方案來解決這個問題。我發佈了關於它的情況,因爲我跑了同樣的問題,並沒有首先找到你的問題,看到這裏: http://stackoverflow.com/questions/18065299/is-it-possible-in-the-same -cmakelists-txt-to-setup-projects-with-mt-and-other/18068420#18068420 – 2013-08-05 21:53:51

回答

0

CMAKE_BUILD_TYPE僅適用於單配置生成器。多配置生成器(MSVC和Xcode)可以在一個構建目錄中爲多個配置構建,因此CMAKE_BUILD_TYPE標誌沒有意義。

COMPILE_FLAGS目標屬性不區分不同的配置(有關更多信息,請參見kitware bugtracker)。

解決方法是建立兩個構建目錄,類似於人們使用Makefile生成器的方式,並在構建用於分發的二進制文件時定義附加標誌。 (即發佈配置)

+0

解決方法雖然不起作用,但最終必須在數十萬個不同的地方進行設置。 (具體來說,要更改配置,您必須完成所有上百個項目並將其更改,然後在構建時在VS IDE中對其進行更改等。) – 2012-04-17 22:23:47

+0

不,我的意思是您應該使用您發佈的確切代碼在問題中,而不是使用CMAKE_BUILD_TYPE,而是使用MY_RELEASEBUILD,並且只定義在您要創建用於分發的構建時。 (假設你在本地運行時使用/ MDd是可以的) – phb 2012-04-17 22:36:54

+0

但是你必須在VS中選擇正確的內容來匹配,並且它不能爲每個目標設置。這樣做的關鍵就是能夠使用CMAke的構建配置支持。 – 2012-04-17 22:54:36

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.txtMTMTd標誌:

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中的一個子目錄和CMakeLists.txt以及所有dy另一方面,如果你有很多的目標,則可以使用CRT。

+0

請注意,現在有更好的解決方案,使用target_compile_options()cmake函數。這是全新的(2013年6月),只在日常編譯中可用,但這很整潔!看到這裏:http://stackoverflow.com/questions/18065299/is-it-possible-in-the-same-cmakelists-txt-to-setup-projects-with-mt-and-other/18068420#18068420 – 2013-08-05 21:56:44

26

在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目標配置映射) 。

相關問題