<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 1.9 為語言設定標準 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-01/recipe-09 中找到,包含一個C++和Fortran示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 編程語言有不同的標準,即提供改進的語言版本。啟用新標準是通過設置適當的編譯器標志來實現的。前面的示例中,我們已經展示了如何為每個目標或全局進行配置。3.1版本中,CMake引入了一個獨立于平臺和編譯器的機制,用于為`C++`和`C`設置語言標準:為目標設置` <LANG>_STANDARD`屬性。 ## 準備工作 對于下面的示例,需要一個符合`C++14`標準或更高版本的`C++`編譯器。此示例代碼定義了動物的多態,我們使用`std::unique_ptr`作為結構中的基類: ```c++ std::unique_ptr<Animal> cat = Cat("Simon"); std::unique_ptr<Animal> dog = Dog("Marlowe); ``` 沒有為各種子類型顯式地使用構造函數,而是使用工廠方法的實現。工廠方法使用`C++11`的可變參數模板實現。它包含繼承層次結構中每個對象的創建函數映射: ```c++ typedef std::function<std::unique_ptr<Animal>(const std::string &)> CreateAnimal; ``` 基于預先分配的標簽來分派它們,創建對象: ```c++ std::unique_ptr<Animal> simon = farm.create("CAT", "Simon"); std::unique_ptr<Animal> marlowe = farm.create("DOG", "Marlowe"); ``` 標簽和創建功能在工廠使用前已注冊: ```c++ Factory<CreateAnimal> farm; farm.subscribe("CAT", [](const std::string & n) { return std::make_unique<Cat>(n); }); farm.subscribe("DOG", [](const std::string & n) { return std::make_unique<Dog>(n); }); ``` 使用`C++11 Lambda`函數定義創建函數,使用`std::make_unique`來避免引入裸指針的操作。這個工廠函數是在`C++14`中引入。 **NOTE**:*CMake的這一功能是在3.1版中添加的,并且還在更新。CMake的后續版本為`C++`標準的后續版本和不同的編譯器,提供了越來越好的支持。我們建議您在文檔頁面上檢查您選擇的編譯器是否受支持: https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html#supported-compiler* ## 具體實施 將逐步構建`CMakeLists.txt`,并展示如何設置語言標準(本例中是`C++14`): 1. 聲明最低要求的CMake版本,項目名稱和語言: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-09 LANGUAGES CXX) ``` 2. 要求在Windows上導出所有庫符號: ```cmake set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) ``` 3. 需要為庫添加一個目標,這將編譯源代碼為一個動態庫: ```cmake add_library(animals SHARED Animal.cpp Animal.hpp Cat.cpp Cat.hpp Dog.cpp Dog.hpp Factory.hpp ) ``` 4. 現在,為目標設置了`CXX_STANDARD`、`CXX_EXTENSIONS`和`CXX_STANDARD_REQUIRED`屬性。還設置了`position_independent ent_code`屬性,以避免在使用一些編譯器構建DSO時出現問題: ```cmake set_target_properties(animals PROPERTIES CXX_STANDARD 14 CXX_EXTENSIONS OFF CXX_STANDARD_REQUIRED ON POSITION_INDEPENDENT_CODE 1 ) ``` 5. 然后,為"動物農場"的可執行文件添加一個新目標,并設置它的屬性: ```cmake add_executable(animal-farm animal-farm.cpp) set_target_properties(animal-farm PROPERTIES CXX_STANDARD 14 CXX_EXTENSIONS OFF CXX_STANDARD_REQUIRED ON ) ``` 6. 最后,將可執行文件鏈接到庫: ```cmake target_link_libraries(animal-farm animals) ``` 7. 現在,來看看貓和狗都說了什么: ```shell $ mkdir -p build $ cd build $ cmake .. $ cmake --build . $ ./animal-farm I'm Simon the cat! I'm Marlowe the dog! ``` ## 工作原理 步驟4和步驟5中,我們為動物和動物農場目標設置了一些屬性: * **CXX_STANDARD**會設置我們想要的標準。 * **CXX_EXTENSIONS**告訴CMake,只啟用`ISO C++`標準的編譯器標志,而不使用特定編譯器的擴展。 * **CXX_STANDARD_REQUIRED**指定所選標準的版本。如果這個版本不可用,CMake將停止配置并出現錯誤。當這個屬性被設置為`OFF`時,CMake將尋找下一個標準的最新版本,直到一個合適的標志。這意味著,首先查找`C++14`,然后是`C++11`,然后是`C++98`。(譯者注:目前會從`C++20`或`C++17`開始查找) **NOTE**:*本書發布時,還沒有`Fortran_STANDARD`可用,但是可以使用`target_compile_options`設置標準,可以參見: https://github.com/devcafe/cmake-cookbook/tree/v1.0/chapter-01/recipe-09* **TIPS**:*如果語言標準是所有目標共享的全局屬性,那么可以將`CMAKE_<LANG>_STANDARD `、`CMAKE_<LANG>_EXTENSIONS`和`CMAKE_<LANG>_STANDARD_REQUIRED`變量設置為相應的值。所有目標上的對應屬性都將使用這些設置。* ## 更多信息 通過引入編譯特性,CMake對語言標準提供了更精細的控制。這些是語言標準引入的特性,比如`C++11`中的可變參數模板和`Lambda`表達式,以及`C++14`中的自動返回類型推斷。可以使用`target_compile_features()`命令要求為特定的目標提供特定的特性,CMake將自動為標準設置正確的編譯器標志。也可以讓CMake為可選編譯器特性,生成兼容頭文件。 **TIPS**:*我們建議閱讀CMake在線文檔,全面了解`cmake-compile-features`和如何處理編譯特性和語言標準: https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html 。*
                  <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>

                              哎呀哎呀视频在线观看