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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 2.2 處理與平臺相關的源代碼 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-02/recipe-02 中找到,包含一個C++示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 理想情況下,應該避免依賴于平臺的源代碼,但是有時我們沒有選擇,特別是當要求配置和編譯不是自己編寫的代碼時。本示例中,將演示如何使用CMake根據操作系統編譯源代碼。 ## 準備工作 修改`hello-world.cpp`示例代碼,將第1章第1節的例子進行修改: ```c++ #include <cstdlib> #include <iostream> #include <string> std::string say_hello() { #ifdef IS_WINDOWS return std::string("Hello from Windows!"); #elif IS_LINUX return std::string("Hello from Linux!"); #elif IS_MACOS return std::string("Hello from macOS!"); #else return std::string("Hello from an unknown system!"); #endif } int main() { std::cout << say_hello() << std::endl; return EXIT_SUCCESS; } ``` ## 具體實施 完成一個`CMakeLists.txt`實例,使我們能夠基于目標操作系統有條件地編譯源代碼: 1. 首先,設置了CMake最低版本、項目名稱和支持的語言: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-02 LANGUAGES CXX) ``` 2. 然后,定義可執行文件及其對應的源文件: ```cmake add_executable(hello-world hello-world.cpp) ``` 3. 通過定義以下目標編譯定義,讓預處理器知道系統名稱: ```cmake if(CMAKE_SYSTEM_NAME STREQUAL "Linux") target_compile_definitions(hello-world PUBLIC "IS_LINUX") endif() if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") target_compile_definitions(hello-world PUBLIC "IS_MACOS") endif() if(CMAKE_SYSTEM_NAME STREQUAL "Windows") target_compile_definitions(hello-world PUBLIC "IS_WINDOWS") endif() ``` 繼續之前,先檢查前面的表達式,并考慮在不同系統上有哪些行為。 4. 現在,準備測試它,并配置項目: ```shell $ mkdir -p build $ cd build $ cmake .. $ cmake --build . $ ./hello-world Hello from Linux! ``` Windows系統上,將看到來自Windows的Hello。其他操作系統將產生不同的輸出。 ## 工作原理 `hello-world.cpp`示例中,有趣的部分是基于預處理器定義`IS_WINDOWS`、`IS_LINUX`或`IS_MACOS`的條件編譯: ```cmake std::string say_hello() { #ifdef IS_WINDOWS return std::string("Hello from Windows!"); #elif IS_LINUX return std::string("Hello from Linux!"); #elif IS_MACOS return std::string("Hello from macOS!"); #else return std::string("Hello from an unknown system!"); #endif } ``` 這些定義在CMakeLists.txt中配置時定義,通過使用`target_compile_definition`在預處理階段使用。可以不重復`if-endif`語句,以更緊湊的表達式實現,我們將在下一個示例中演示這種重構方式。也可以把`if-endif`語句加入到一個`if-else-else-endif`語句中。這個階段,可以使用`add_definitions(-DIS_LINUX)`來設置定義(當然,可以根據平臺調整定義),而不是使用`target_compile_definition`。使用`add_definitions`的缺點是,會修改編譯整個項目的定義,而`target_compile_definitions`給我們機會,將定義限制于一個特定的目標,以及通過` PRIVATE|PUBLIC|INTERFACE `限定符,限制這些定義可見性。第1章的第8節,對這些限定符有詳細的說明: - **PRIVATE**,編譯定義將只應用于給定的目標,而不應用于相關的其他目標。 - **INTERFACE**,對給定目標的編譯定義將只應用于使用它的目標。 - **PUBLIC**,編譯定義將應用于給定的目標和使用它的所有其他目標。 **NOTE**:*將項目中的源代碼與平臺相關性最小化,可使移植更加容易。*
                  <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>

                              哎呀哎呀视频在线观看