<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.3 處理與編譯器相關的源代碼 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-02/recipe-03 中找到,包含一個C++和Fortran示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 這個方法與前面的方法類似,我們將使用CMake來編譯依賴于環境的條件源代碼:本例將依賴于編譯器。為了可移植性,我們盡量避免去編寫新代碼,但遇到有依賴的情況我們也要去解決,特別是當使用歷史代碼或處理編譯器依賴工具,如[sanitizers](https://github.com/google/sanitizers)。從這一章和前一章的示例中,我們已經掌握了實現這一目標的所有方法。盡管如此,討論與編譯器相關的源代碼的處理問題還是很有用的,這樣我們將有機會從另一方面了解CMake。 ## 準備工作 本示例中,我們將從`C++`中的一個示例開始,稍后我們將演示一個`Fortran`示例,并嘗試重構和簡化CMake代碼。 看一下`hello-world.cpp`源代碼: ```c++ #include <cstdlib> #include <iostream> #include <string> std::string say_hello() { #ifdef IS_INTEL_CXX_COMPILER // only compiled when Intel compiler is selected // such compiler will not compile the other branches return std::string("Hello Intel compiler!"); #elif IS_GNU_CXX_COMPILER // only compiled when GNU compiler is selected // such compiler will not compile the other branches return std::string("Hello GNU compiler!"); #elif IS_PGI_CXX_COMPILER // etc. return std::string("Hello PGI compiler!"); #elif IS_XL_CXX_COMPILER return std::string("Hello XL compiler!"); #else return std::string("Hello unknown compiler - have we met before?"); #endif } int main() { std::cout << say_hello() << std::endl; std::cout << "compiler name is " COMPILER_NAME << std::endl; return EXIT_SUCCESS; } ``` `Fortran`示例(`hello-world.F90`): ```fortran program hello implicit none #ifdef IS_Intel_FORTRAN_COMPILER print *, 'Hello Intel compiler!' #elif IS_GNU_FORTRAN_COMPILER print *, 'Hello GNU compiler!' #elif IS_PGI_FORTRAN_COMPILER print *, 'Hello PGI compiler!' #elif IS_XL_FORTRAN_COMPILER print *, 'Hello XL compiler!' #else print *, 'Hello unknown compiler - have we met before?' #endif end program ``` ## 具體實施 我們將從`C++`的例子開始,然后再看`Fortran`的例子: 1. `CMakeLists.txt`文件中,定義了CMake最低版本、項目名稱和支持的語言: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-03 LANGUAGES CXX) ``` 2. 然后,定義可執行目標及其對應的源文件: ```cmake add_executable(hello-world hello-world.cpp) ``` 3. 通過定義以下目標編譯定義,讓預處理器了解編譯器的名稱和供應商: ```cmake target_compile_definitions(hello-world PUBLIC "COMPILER_NAME=\"${CMAKE_CXX_COMPILER_ID}\"") if(CMAKE_CXX_COMPILER_ID MATCHES Intel) target_compile_definitions(hello-world PUBLIC "IS_INTEL_CXX_COMPILER") endif() if(CMAKE_CXX_COMPILER_ID MATCHES GNU) target_compile_definitions(hello-world PUBLIC "IS_GNU_CXX_COMPILER") endif() if(CMAKE_CXX_COMPILER_ID MATCHES PGI) target_compile_definitions(hello-world PUBLIC "IS_PGI_CXX_COMPILER") endif() if(CMAKE_CXX_COMPILER_ID MATCHES XL) target_compile_definitions(hello-world PUBLIC "IS_XL_CXX_COMPILER") endif() ``` 現在我們已經可以預測結果了: ```shell $ mkdir -p build $ cd build $ cmake .. $ cmake --build . $ ./hello-world Hello GNU compiler! ``` 使用不同的編譯器,此示例代碼將打印不同的問候語。 前一個示例的`CMakeLists.txt`文件中的`if`語句似乎是重復的,我們不喜歡重復的語句。能更簡潔地表達嗎?當然可以!為此,讓我們再來看看`Fortran`示例。 `Fortran`例子的`CMakeLists.txt`文件中,我們需要做以下工作: 1. 需要使`Fortran`語言: ```cmake project(recipe-03 LANGUAGES Fortran) ``` 2. 然后,定義可執行文件及其對應的源文件。在本例中,使用大寫`.F90`后綴: ```cmake add_executable(hello-world hello-world.F90) ``` 3. 我們通過定義下面的目標編譯定義,讓預處理器非常清楚地了解編譯器: ```cmake target_compile_definitions(hello-world PUBLIC "IS_${CMAKE_Fortran_COMPILER_ID}_FORTRAN_COMPILER" ) ``` 其余行為與`C++`示例相同。 ## 工作原理 `CMakeLists.txt`會在配置時,進行預處理定義,并傳遞給預處理器。`Fortran`示例包含非常緊湊的表達式,我們使用`CMAKE_Fortran_COMPILER_ID`變量,通過`target_compile_definition`使用構造預處理器進行預處理定義。為了適應這種情況,我們必須將"Intel"從`IS_INTEL_CXX_COMPILER`更改為`IS_Intel_FORTRAN_COMPILER`。通過使用相應的`CMAKE_C_COMPILER_ID`和`CMAKE_CXX_COMPILER_ID`變量,我們可以在`C`或`C++`中實現相同的效果。但是,請注意,` CMAKE_<LANG>_COMPILER_ID`不能保證為所有編譯器或語言都定義。 **NOTE**:*對于應該預處理的`Fortran`代碼使用`.F90`后綴,對于不需要預處理的代碼使用`.f90`后綴。*
                  <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>

                              哎呀哎呀视频在线观看