<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 5.4 構建時運行自定義命令:Ⅱ. 使用add_custom_target **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-5/recipe-04 中找到,其中包含一個C++例子。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 我們在前面的示例,討論了`add_custom_command`有一些限制,可以通過`add_custom_target`繞過這些限制。這個CMake命令將引入新的目標,與`add_custom_command`相反,這些目標依次執行不返回輸出。可以將`add_custom_target`和`add_custom_command`結合使用。使用這種方法,可以與其依賴項所在目錄不同的目錄指定自定義目標,CMake基礎設施對項目設計模塊化非常有用。 ## 準備工作 我們將重用前一節示例,對源碼進行簡單的修改。特別是,將把壓縮后的`tar`打包文件放在名為`deps`的子目錄中,而不是存儲在主目錄中。這個子目錄包含它自己的`CMakeLists.txt`,將由主`CMakeLists.txt`調用。 ## 具體實施 我們將從主`CMakeLists.txt`開始,然后討論`deps/CMakeLists.txt`: 1. 聲明啟用C++11: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-04 LANGUAGES CXX Fortran) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` 2. 現在,繼續討論`deps/CMakeLists.txt`。這通過`add_subdirectory`命令實現: ```cmake add_subdirectory(deps) ``` 3. `deps/CMakeLists.txt`中,我們首先定位必要的庫(BLAS和LAPACK): ```cmake find_package(BLAS REQUIRED) find_package(LAPACK REQUIRED) ``` 4. 然后,我們將`tar`包的內容匯集到一個變量`MATH_SRCS`中: ```cmake set(MATH_SRCS ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxBLAS.cpp ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxLAPACK.cpp ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxBLAS.hpp ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxLAPACK.hpp ) ``` 5. 列出要打包的源之后,定義一個目標和一個命令。這個組合用于提取`${CMAKE_CURRENT_BINARY_DIR}`中的包。但是,這里我們在一個不同的范圍內,引用`deps/CMakeLists.txt`,因此`tar`包將存放在到主項目構建目錄下的`deps`子目錄中: ```cmake add_custom_target(BLAS_LAPACK_wrappers WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${MATH_SRCS} COMMENT "Intermediate BLAS_LAPACK_wrappers target" VERBATIM ) add_custom_command( OUTPUT ${MATH_SRCS} COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_CURRENT_SOURCE_DIR}/wrap_BLAS_LAPACK.tar.gz WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/wrap_BLAS_LAPACK.tar.gz COMMENT "Unpacking C++ wrappers for BLAS/LAPACK" ) ``` 6. 添加數學庫作為目標,并指定相應的源,包括目錄和鏈接庫: ```cmake add_library(math "") target_sources(math PRIVATE ${MATH_SRCS} ) target_include_directories(math INTERFACE ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK ) # BLAS_LIBRARIES are included in LAPACK_LIBRARIES target_link_libraries(math PUBLIC ${LAPACK_LIBRARIES} ) ``` 7. 執行完`deps/CMakeLists.txt`中的命令,返回到父范圍,定義可執行目標,并將其鏈接到另一個目錄的數學庫: ```cmake add_executable(linear-algebra linear-algebra.cpp) target_link_libraries(linear-algebra PRIVATE math ) ``` ## 工作原理 用戶可以使用`add_custom_target`,在目標中執行定制命令。這與我們前面討論的`add_custom_command`略有不同。`add_custom_target`添加的目標沒有輸出,因此總會執行。因此,可以在子目錄中引入自定義目標,并且仍然能夠在主`CMakeLists.txt`中引用它。 本例中,使用`add_custom_target`和`add_custom_command`提取了源文件的包。這些源文件稍后用于編譯另一個庫,我們設法在另一個(父)目錄范圍內鏈接這個庫。構建`CMakeLists.txt`文件的過程中,`tar`包是在`deps`下,`deps`是項目構建目錄下的一個子目錄。這是因為在CMake中,構建樹的結構與源樹的層次結構相同。 這個示例中有一個值得注意的細節,就是我們把數學庫的源標記為`PRIVATE`: ```cmake set(MATH_SRCS ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxBLAS.cpp ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxLAPACK.cpp ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxBLAS.hpp ${CMAKE_CURRENT_BINARY_DIR}/wrap_BLAS_LAPACK/CxxLAPACK.hpp ) # ... add_library(math "") target_sources(math PRIVATE ${MATH_SRCS} ) # ... ``` 雖然這些源代碼是`PRIVATE`,但我們在父范圍內編譯了`linear-algebra.cpp`,并且這個源代碼包括`CxxBLAS.hpp`和`CxxLAPACK.hpp`。為什么這里使用`PRIVATE`,以及如何編譯`linear-algebra.cpp`,并構建可執行文件呢?如果將頭文件標記為`PUBLIC`, CMake就會在創建時停止,并出現一個錯誤,“無法找到源文件”,因為要生成(提取)還不存在于文件樹中的源文件。 這是一個已知的限制(參見https://gitlab.kitware.com/cmake/cmake/issues/1633 ,以及相關的博客文章:https://samthursfield.wordpress.com/2015/11/21/cmake-depende-ncies-targets-and-files-and-custom-commands )。我們通過聲明源代碼為`PRIVATE`來解決這個限制。這樣CMake時,沒有獲得對不存在源文件的依賴。但是,CMake內置的C/C++文件依賴關系掃描器在構建時獲取它們,并編譯和鏈接源代碼。
                  <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>

                              哎呀哎呀视频在线观看