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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 6.3 構建時使用Python生成源碼 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-6/recipe-03 中找到,其中包含一個C++例子。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 構建時根據某些規則生成冗長和重復的代碼,同時避免在源代碼存儲庫中顯式地跟蹤生成的代碼生成源代碼,是開發人員工具箱中的一個重要工具,例如:根據檢測到的平臺或體系結構生成不同的源代碼。或者,可以使用Python,根據配置時收集的輸入,在構建時生成高效的C++代碼。其他生成器解析器,比如:Flex (https://github.com/westes/flex )和Bison(https://www.gnu.org/software/bison/ );元對象編譯器,如Qt的moc(http://doc.qt.io/qt5/moc.html );序列化框架,如谷歌的protobuf (https://developers.google.com/protocol-buffers/ )。 ## 準備工作 為了提供一個具體的例子,我們需要編寫代碼來驗證一個數字是否是質數。現在有很多算法,例如:可以用埃拉托色尼的篩子(sieve of Eratosthenes)來分離質數和非質數。如果有很多驗證數字,我們不希望對每一個數字都進行Eratosthenes篩選。我們想要做的是將所有質數一次制表,直到數字的上限,然后使用一個表查的方式,找來驗證大量的數字。 本例中,將在編譯時使用Python為查找表(質數向量)生成C++代碼。當然,為了解決這個特殊的編程問題,我們還可以使用C++生成查詢表,并且可以在運行時執行查詢。 讓我們從`generate.py`腳本開始。這個腳本接受兩個命令行參數——一個整數范圍和一個輸出文件名: ```python """ Generates C++ vector of prime numbers up to max_number using sieve of Eratosthenes. """ import pathlib import sys # for simplicity we do not verify argument list max_number = int(sys.argv[-2]) output_file_name = pathlib.Path(sys.argv[-1]) numbers = range(2, max_number + 1) is_prime = {number: True for number in numbers} for number in numbers: current_position = number if is_prime[current_position]: while current_position <= max_number: current_position += number is_prime[current_position] = False primes = (number for number in numbers if is_prime[number]) code = """#pragma once #include <vector> const std::size_t max_number = {max_number}; std::vector<int> & primes() {{ static std::vector<int> primes; {push_back} return primes; }} """ push_back = '\n'.join([' primes.push_back({:d});'.format(x) for x in primes]) output_file_name.write_text( code.format(max_number=max_number, push_back=push_back)) ``` 我們的目標是生成一個`primes.hpp`,并將其包含在下面的示例代碼中: ```c++ #include "primes.hpp" #include <iostream> #include <vector> int main() { std::cout << "all prime numbers up to " << max_number << ":"; for (auto prime : primes()) std::cout << " " << prime; std::cout << std::endl; return 0; } ``` ## 具體實施 下面是CMakeLists.txt命令的詳解: 1. 首先,定義項目并檢測Python解釋器: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-03 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(PythonInterp QUIET REQUIRED) ``` 2. 將生成的代碼放在`${CMAKE_CURRENT_BINARY_DIR}/generate`下,需要告訴CMake創建這個目錄: ```cmake file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated) ``` 3. Python腳本要求質數的上限,使用下面的命令,我們可以設置一個默認值: ```cmake set(MAX_NUMBER "100" CACHE STRING "Upper bound for primes") ``` 4. 接下來,定義一個自定義命令來生成頭文件: ```cmake add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp COMMAND ${PYTHON_EXECUTABLE} generate.py ${MAX_NUMBER} ${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS generate.py ) ``` 5. 最后,定義可執行文件及其目標,包括目錄和依賴關系: ```cmake add_executable(example "") target_sources(example PRIVATE example.cpp ${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp ) target_include_directories(example PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated ) ``` 6. 準備測試: ```shell $ mkdir -p build $ cd build $ cmake .. $ cmake --build . $ ./example all prime numbers up to 100: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 ``` ## 具體實施 為了生成頭文件,我們定義了一個自定義命令,它執行`generate.py`腳本,并接受`${MAX_NUMBER}`和文件路徑(`${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp`)作為參數: ```cmake add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp COMMAND ${PYTHON_EXECUTABLE} generate.py ${MAX_NUMBER} ${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS generate.py ) ``` 為了生成源代碼,我們需要在可執行文件的定義中,使用`target_sources`很容易實現添加源代碼作為依賴項: ```cmake target_sources(example PRIVATE example.cpp ${CMAKE_CURRENT_BINARY_DIR}/generated/primes.hpp ) ``` 前面的代碼中,我們不需要定義新的目標。頭文件將作為示例的依賴項生成,并在每次`generate.py`腳本更改時重新生成。如果代碼生成腳本生成多個源文件,那么要將所有生成的文件列出,做為某些目標的依賴項。 ## 更多信息 我們提到所有的生成文件,都應該作為某個目標的依賴項。但是,我們可能不知道這個文件列表,因為它是由生成文件的腳本決定的,這取決于我們提供給配置的輸入。這種情況下,我們可能會嘗試使用`file(GLOB…)`將生成的文件收集到一個列表中(參見https://cmake.org/cmake/help/v3.5/command/file.html )。 `file(GLOB…)`在配置時執行,而代碼生成是在構建時發生的。因此可能需要一個間接操作,將`file(GLOB…)`命令放在一個單獨的CMake腳本中,使用`${CMAKE_COMMAND} -P`執行該腳本,以便在構建時獲得生成的文件列表。
                  <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>

                              哎呀哎呀视频在线观看