簡體   English   中英

CMake 中的調試與發布

[英]Debug vs Release in CMake

在 GCC 編譯的項目中,

  • 如何為每個目標類型(調試/發布)運行 CMake?
  • 如何使用 CMake 指定調試和發布 C/C++ 標志?
  • 我如何表示主可執行文件將使用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將為您的編譯器添加適當的標志。 還有RelWithDebInfoMinSizeRel構建配置。


您可以通過指定一個工具鏈文件來修改/添加到標志,您可以在其中添加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傳遞)。 它采用ReleaseDebug等值。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM