[英]Debug vs Release in CMake
在 GCC 編譯的項目中,
g++
和一個帶有gcc
嵌套庫進行gcc
?使用 CMake,通常建議進行“源外”構建。 在項目的根目錄中創建CMakeLists.txt
。 然后從您的項目的根目錄:
mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make
對於Debug
(再次從項目的根目錄):
mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
Release
/ Debug
將為您的編譯器添加適當的標志。 還有RelWithDebInfo
和MinSizeRel
構建配置。
您可以通過指定一個工具鏈文件來修改/添加到標志,您可以在其中添加CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
變量,例如:
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")
有關更多詳細信息,請參閱CMAKE_BUILD_TYPE 。
至於你的第三個問題,我不確定你到底在問什么。 CMake 應該自動檢測並使用適合您不同源文件的編譯器。
對於調試/發布標志,請參閱CMAKE_BUILD_TYPE
變量(您將其作為cmake -DCMAKE_BUILD_TYPE=value
傳遞)。 它采用Release
、 Debug
等值。
https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools
cmake 使用擴展名來選擇編譯器,因此只需將文件命名為 .c。
您可以使用各種設置覆蓋它:
例如:
set_source_files_properties(yourfile.c LANGUAGE CXX)
將使用 g++ 編譯 .c 文件。 上面的鏈接還顯示了如何為 C/C++ 選擇特定的編譯器。
您可以使用add_compile_options
,而不是直接操作CMAKE_CXX_FLAGS
字符串(使用string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")
可以更好地完成):
add_compile_options(
"-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
"$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)
這會將指定的警告添加到所有構建類型,但僅將給定的調試標志添加到DEBUG
構建。 請注意,編譯選項存儲為 CMake 列表,它只是一個用分號分隔其元素的字符串;
.
這里的很多答案已經過時/不好。 所以我將嘗試更好地回答它。 當然,我會在 2020 年回答這個問題,所以預計事情會發生變化。
如何為每個目標類型(調試/發布)運行 CMake?
首先,調試/發布在 cmake (nitpick) 中被稱為配置。
如果您使用單個配置生成器(Ninja/Unix-Makefiles)
然后,您需要為每個配置創建一個構建文件夾。
像這樣:
# Configure the build
cmake -S . -B build/Debug -D CMAKE_BUILD_TYPE=Release
# Actually build the binaries
cmake --build build/Debug
對於多配置生成器,它略有不同(Ninja Multi-Config,Visual Studio)
# Configure the build
cmake -S . -B build
# Actually build the binaries
cmake --build build --config Debug
如果您想知道為什么這是必要的,那是因為 cmake 不是構建系統。 這是一個元構建系統(即構建構建系統的構建系統)。 這基本上是處理支持 1 個構建中的多個配置的構建系統的結果。 如果您想更深入地了解,我建議您閱讀 Craig Scott 的書“Professional CMake: A Practical Guide”中有關 cmake 的一些內容
如何使用 CMake 指定調試和發布 C/C++ 標志?
現代做法是使用目標和屬性。
下面是一個例子:
add_library(foobar)
# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
$<$<CONFIG:Debug>:
FOOBAR_DEBUG=1
>
)
注意:我如何使用生成器表達式來指定配置! 使用 CMAKE_BUILD_TYPE 將導致任何多配置生成器的構建錯誤!
此外,有時您需要全局設置,而不僅僅是針對一個目標。 使用 add_compile_definitions、add_compile_options 等。這些函數支持生成器表達式。 除非必須,否則不要使用舊式 cmake(這條路是噩夢之地)
我如何表示主可執行文件將使用 g++ 和一個帶有 gcc 的嵌套庫進行編譯?
你最后一個問題真的沒有意義。
如果你想在不重新生成的情況下構建不同的配置,如果使用你也可以運行cmake --build {$PWD} --config <cfg>
對於多配置工具,選擇<cfg>
ex。 調試、發布、MinSizeRel、RelWithDebInfo
https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir
// CMakeLists.txt : 發布
set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)
// CMakeLists.txt : 調試
set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.