<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.8 探究可執行命令 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-5/recipe-08 中找到,其中包含一個C/C++例子。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 目前為止,我們已經展示了如何檢查給定的源代碼,是否可以由所選的編譯器編譯,以及如何確保所需的編譯器和鏈接器標志可用。此示例中,將顯示如何檢查是否可以在當前系統上編譯、鏈接和運行代碼。 ## 準備工作 本示例的代碼示例是復用第3章第9節的配置,并進行微小的改動。之前,我們展示了如何在您的系統上找到ZeroMQ庫并將其鏈接到一個C程序中。本示例中,在生成實際的C++程序之前,我們將檢查一個使用GNU/Linux上的系統UUID庫的小型C程序是否能夠實際運行。 ## 具體實施 開始構建C++項目之前,我們希望檢查GNU/Linux上的UUID系統庫是否可以被鏈接。這可以通過以下一系列步驟來實現: 1. 聲明一個混合的C和C++11程序。這是必要的,因為我們要編譯和運行的測試代碼片段是使用C語言完成: ```cmake cmake_minimum_required(VERSION 3.6 FATAL_ERROR) project(recipe-08 LANGUAGES CXX C) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` 2. 我們需要在系統上找到UUID庫。這通過使用`pkg-config`實現的。要求搜索返回一個CMake導入目標使用`IMPORTED_TARGET`參數: ```cmake find_package(PkgConfig REQUIRED QUIET) pkg_search_module(UUID REQUIRED uuid IMPORTED_TARGET) if(TARGET PkgConfig::UUID) message(STATUS "Found libuuid") endif() ``` 3. 接下來,需要使用`CheckCSourceRuns.cmake`模塊。C++的是`CheckCXXSourceRuns.cmake`模塊。但到CMake 3.11為止,Fortran語言還沒有這樣的模塊: ```cmake include(CheckCSourceRuns) ``` 4. 我們聲明一個`_test_uuid`變量,其中包含要編譯和運行的C代碼段: ```cmake set(_test_uuid " #include <uuid/uuid.h> int main(int argc, char * argv[]) { uuid_t uuid; uuid_generate(uuid); return 0; } ") ``` 5. 我們聲明`CMAKE_REQUIRED_LIBRARIES`變量后,對`check_c_source_runs`函數的調用。接下來,調用`check_c_source_runs`,其中測試代碼作為第一個參數,`_runs`變量作為第二個參數,以保存執行的檢查結果。之后,取消`CMAKE_REQUIRED_LIBRARIES`變量的設置: ```cmake set(CMAKE_REQUIRED_LIBRARIES PkgConfig::UUID) check_c_source_runs("${_test_uuid}" _runs) unset(CMAKE_REQUIRED_LIBRARIES) ``` 6. 如果檢查沒有成功,要么是代碼段沒有編譯,要么是沒有運行,我們會用致命的錯誤停止配置: ```cmake if(NOT _runs) message(FATAL_ERROR "Cannot run a simple C executable using libuuid!") endif() ``` 7. 若成功,我們繼續添加C++可執行文件作為目標,并鏈接到UUID: ```cmake add_executable(use-uuid use-uuid.cpp) target_link_libraries(use-uuid PUBLIC PkgConfig::UUID ) ``` ## 工作原理 `check_<lang>_source_runs`用于C和C++的函數,與`check_<lang>_source_compile`相同,但在實際運行生成的可執行文件的地方需要添加一個步驟。對于`check_<lang>_source_compiles`, `check_<lang>_source_runs`的執行可以通過以下變量來進行: * CMAKE_REQUIRED_FLAGS:設置編譯器標志。 * CMAKE_REQUIRED_DEFINITIONS:設置預編譯宏。 * CMAKE_REQUIRED_INCLUDES:設置包含目錄列表。 * CMAKE_REQUIRED_LIBRARIES:設置可執行目標需要連接的庫列表。 由于使用`pkg_search_module`生成的為導入目標,所以只需要將`CMAKE_REQUIRES_LIBRARIES`設置為`PkgConfig::UUID`,就可以正確設置包含目錄。 正如`check_<lang>_source_compiles`是`try_compile`的包裝器,`check_<lang>_source_runs`是CMake中另一個功能更強大的命令的包裝器:`try_run`。因此,可以編寫一個`CheckFortranSourceRuns.cmake`模塊,通過適當包裝`try_run`, 提供與C和C++模塊相同的功能。 **NOTE**:*`pkg_search_module`只能定義導入目標(CMake 3.6),但目前的示例可以使工作,3.6之前版本的CMake可以通過手動設置所需的包括目錄和庫`check_c_source_runs`如下:`set(CMAKE_REQUIRED_INCLUDES $ {UUID_INCLUDE_DIRS})`和`set(CMAKE_REQUIRED_LIBRARIES $ {UUID_LIBRARIES})`。*
                  <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>

                              哎呀哎呀视频在线观看