<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 5.7 探究編譯器標志命令 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-5/recipe-07 中找到,其中包含一個C++例子。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 設置編譯器標志,對是否能正確編譯至關重要。不同的編譯器供應商,為類似的特性實現有不同的標志。即使是來自同一供應商的不同編譯器版本,在可用標志上也可能存在細微的差異。有時,會引入一些便于調試或優化目的的新標志。本示例中,我們將展示如何檢查所選編譯器是否可用某些標志。 ## 準備工作 Sanitizers(請參考https://github.com/google/Sanitizers )已經成為靜態和動態代碼分析的非常有用的工具。通過使用適當的標志重新編譯代碼并鏈接到必要的庫,可以檢查內存錯誤(地址清理器)、未初始化的讀取(內存清理器)、線程安全(線程清理器)和未定義的行為(未定義的行為清理器)相關的問題。與同類型分析工具相比,Sanitizers帶來的性能損失通常要小得多,而且往往提供關于檢測到的問題的更詳細的信息。缺點是,代碼(可能還有工具鏈的一部分)需要使用附加的標志重新編譯。 本示例中,我們將設置一個項目,使用不同的Sanitizers來編譯代碼,并展示如何檢查,編譯器標志是否正確使用。 ## 具體實施 Clang編譯器已經提供了Sanitizers,GCC也將其引入工具集中。它們是為C和C++程序而設計的。最新版本的Fortran也能使用這些編譯標志,并生成正確的儀表化庫和可執行程序。不過,本文將重點介紹C++示例。 1. 聲明一個C++11項目: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-07 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` 2. 聲明列表`CXX_BASIC_FLAGS`,其中包含構建項目時始終使用的編譯器標志`-g3`和`-O1`: ```cmake list(APPEND CXX_BASIC_FLAGS "-g3" "-O1") ``` 3. 這里需要包括CMake模塊` CheckCXXCompilerFlag.cmake `。C的模塊為` CheckCCompilerFlag.cmake `,Fotran的模塊為`CheckFortranCompilerFlag.cmake`(Fotran的模塊是在CMake 3.3添加): ```cmake include(CheckCXXCompilerFlag) ``` 4. 我們聲明一個`ASAN_FLAGS`變量,它包含Sanitizer所需的標志,并設置`CMAKE_REQUIRED_FLAGS`變量,`check_cxx_compiler_flag`函數在內部使用該變量: ```cmake set(ASAN_FLAGS "-fsanitize=address -fno-omit-frame-pointer") set(CMAKE_REQUIRED_FLAGS ${ASAN_FLAGS}) ``` 5. 我們調用`check_cxx_compiler_flag`來確保編譯器理解`ASAN_FLAGS`變量中的標志。調用函數后,我們取消設置`CMAKE_REQUIRED_FLAGS`: ```cmake check_cxx_compiler_flag(${ASAN_FLAGS} asan_works) unset(CMAKE_REQUIRED_FLAGS) ``` 6. 如果編譯器理解這些選項,我們將變量轉換為一個列表,用分號替換空格: ```cmake if(asan_works) string(REPLACE " " ";" _asan_flags ${ASAN_FLAGS}) ``` 7. 我們添加了一個可執行的目標,為代碼定位Sanitizer: ```cmake add_executable(asan-example asan-example.cpp) ``` 8. 我們為可執行文件設置編譯器標志,以包含基本的和Sanitizer標志: ```cmake target_compile_options(asan-example PUBLIC ${CXX_BASIC_FLAGS} ${_asan_flags} ) ``` 9. 最后,我們還將Sanitizer標志添加到鏈接器使用的標志集中。這將關閉`if(asan_works)`塊: ```cmake target_link_libraries(asan-example PUBLIC ${_asan_flags}) endif() ``` 完整的示例源代碼還展示了如何編譯和鏈接線程、內存和未定義的行為清理器的示例可執行程序。這里不詳細討論這些,因為我們使用相同的模式來檢查編譯器標志。 **NOTE**:*在GitHub上可以找到一個定制的CMake模塊,用于在您的系統上尋找對Sanitizer的支持:https://github.com/arsenm/sanitizers-cmake* ## 工作原理 `check_<lang>_compiler_flag`函數只是`check_<lang>_source_compiles`函數的包裝器。這些包裝器為特定代碼提供了一種快捷方式。在用例中,檢查特定代碼片段是否編譯并不重要,重要的是編譯器是否理解一組標志。 Sanitizer的編譯器標志也需要傳遞給鏈接器。可以使用`check_<lang>_compiler_flag`函數來實現,我們需要在調用之前設置`CMAKE_REQUIRED_FLAGS`變量。否則,作為第一個參數傳遞的標志將只對編譯器使用。 當前配置中需要注意的是,使用字符串變量和列表來設置編譯器標志。使用`target_compile_options`和`target_link_libraries`函數的字符串變量,將導致編譯器和/或鏈接器報錯。CMake將傳遞引用的這些選項,從而導致解析錯誤。這說明有必要用列表和隨后的字符串操作來表示這些選項,并用分號替換字符串變量中的空格。實際上,CMake中的列表是分號分隔的字符串。 ## 更多信息 我們將在第7章,編寫一個函數來測試和設置編譯器標志,到時候再來回顧,并概括測試和設置編譯器標志的模式。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看