<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國際加速解決方案。 廣告
                # 2.4 檢測處理器體系結構 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-02/recipe-04 中找到,包含一個C++示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 19世紀70年代,出現的64位整數運算和本世紀初出現的用于個人計算機的64位尋址,擴大了內存尋址范圍,開發商投入了大量資源來移植為32位體系結構硬編碼,以支持64位尋址。許多博客文章,如 https://www.viva64.com/en/a/0004/ ,致力于討論將`C++`代碼移植到64位平臺中的典型問題和解決方案。雖然,避免顯式硬編碼的方式非常明智,但需要在使用CMake配置的代碼中適應硬編碼限制。本示例中,我們會來討論檢測主機處理器體系結構的選項。 ## 準備工作 我們以下面的`arch-dependent.cpp`代碼為例: ```c++ #include <cstdlib> #include <iostream> #include <string> #define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) std::string say_hello() { std::string arch_info(TOSTRING(ARCHITECTURE)); arch_info += std::string(" architecture. "); #ifdef IS_32_BIT_ARCH return arch_info + std::string("Compiled on a 32 bit host processor."); #elif IS_64_BIT_ARCH return arch_info + std::string("Compiled on a 64 bit host processor."); #else return arch_info + std::string("Neither 32 nor 64 bit, puzzling ..."); #endif } int main() { std::cout << say_hello() << std::endl; return EXIT_SUCCESS; } ``` ## 具體實施 `CMakeLists.txt`文件中,我們需要以下內容: 1. 首先,定義可執行文件及其源文件依賴關系: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-04 LANGUAGES CXX) add_executable(arch-dependent arch-dependent.cpp) ``` 2. 檢查空指針類型的大小。CMake的`CMAKE_SIZEOF_VOID_P`變量會告訴我們CPU是32位還是64位。我們通過狀態消息讓用戶知道檢測到的大小,并設置預處理器定義: ```cmake if(CMAKE_SIZEOF_VOID_P EQUAL 8) target_compile_definitions(arch-dependent PUBLIC "IS_64_BIT_ARCH") message(STATUS "Target is 64 bits") else() target_compile_definitions(arch-dependent PUBLIC "IS_32_BIT_ARCH") message(STATUS "Target is 32 bits") endif() ``` 3. 通過定義以下目標編譯定義,讓預處理器了解主機處理器架構,同時在配置過程中打印狀態消息: ```cmake if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i386") message(STATUS "i386 architecture detected") elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i686") message(STATUS "i686 architecture detected") elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64") message(STATUS "x86_64 architecture detected") else() message(STATUS "host processor architecture is unknown") endif() target_compile_definitions(arch-dependent PUBLIC "ARCHITECTURE=${CMAKE_HOST_SYSTEM_PROCESSOR}" ) ``` 4. 配置項目,并注意狀態消息(打印出的信息可能會發生變化): ```shell $ mkdir -p build $ cd build $ cmake .. ... -- Target is 64 bits -- x86_64 architecture detected ... ``` 5. 最后,構建并執行代碼(實際輸出將取決于處理器架構): ```shell $ cmake --build . $ ./arch-dependent x86_64 architecture. Compiled on a 64 bit host processor. ``` ## 工作原理 CMake定義了`CMAKE_HOST_SYSTEM_PROCESSOR`變量,以包含當前運行的處理器的名稱。可以設置為“i386”、“i686”、“x86_64”、“AMD64”等等,當然,這取決于當前的CPU。`CMAKE_SIZEOF_VOID_P`為void指針的大小。我們可以在CMake配置時進行查詢,以便修改目標或目標編譯定義。可以基于檢測到的主機處理器體系結構,使用預處理器定義,確定需要編譯的分支源代碼。正如在前面的示例中所討論的,編寫新代碼時應該避免這種依賴,但在處理遺留代碼或交叉編譯時,這種依賴是有用的,交叉編譯會在第13章進行討論。 **NOTE**:*使用`CMAKE_SIZEOF_VOID_P`是檢查當前CPU是否具有32位或64位架構的唯一“真正”可移植的方法。* ## 更多信息 除了`CMAKE_HOST_SYSTEM_PROCESSOR`, CMake還定義了`CMAKE_SYSTEM_PROCESSOR`變量。前者包含當前運行的CPU在CMake的名稱,而后者將包含當前正在為其構建的CPU的名稱。這是一個細微的差別,在交叉編譯時起著非常重要的作用。我們將在第13章,看到更多關于交叉編譯的內容。另一種讓CMake檢測主機處理器體系結構,是使用`C`或`C++中`定義的符號,結合CMake的`try_run`函數,嘗試構建執行的源代碼(見第5.8節)分支的預處理符號。這將返回已定義錯誤碼,這些錯誤可以在CMake端捕獲(此策略的靈感來自 https://github.com/axr/cmake/blob/master/targetarch.cmake ): ```c++ #if defined(__i386) || defined(__i386__) || defined(_M_IX86) #error cmake_arch i386 #elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64) #error cmake_arch x86_64 #endif ``` 這種策略也是檢測目標處理器體系結構的推薦策略,因為CMake似乎沒有提供可移植的內在解決方案。另一種選擇,將只使用CMake,完全不使用預處理器,代價是為每種情況設置不同的源文件,然后使用`target_source `命令將其設置為可執行目標`arch-dependent`依賴的源文件: ```cmake add_executable(arch-dependent "") if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i386") message(STATUS "i386 architecture detected") target_sources(arch-dependent PRIVATE arch-dependent-i386.cpp ) elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "i686") message(STATUS "i686 architecture detected") target_sources(arch-dependent PRIVATE arch-dependent-i686.cpp ) elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64") message(STATUS "x86_64 architecture detected") target_sources(arch-dependent PRIVATE arch-dependent-x86_64.cpp ) else() message(STATUS "host processor architecture is unknown") endif() ``` 這種方法,顯然需要對現有項目進行更多的工作,因為源文件需要分離。此外,不同源文件之間的代碼復制肯定也會成為問題。
                  <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>

                              哎呀哎呀视频在线观看