操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    文章目錄

    學習前言

    最近經常要編譯上clone下來的工程,大部分是基于cmake構建。要是自己想改一改,加一加就需要自己寫.txt。其中有幾個問題始終云里霧里,花了很多時間才搞定。現在主要對找包的問題總結一下。

    相關概念

    編譯 GCC

    GNU編譯器套件gcc可以編譯C,C++,,Java等等編程語言。當程序只有一個源文件時,直接用gcc就可以編譯。

    LLVM(后端)

    剛進入 Apple,Chris 就大展身手:首先在 小組做代碼優化,把 LLVM 運行時的編譯架在 棧上,這樣 棧能夠產出更高效率的圖形代碼。如果顯卡足夠高級,這些代碼會直接扔入 GPU 執行

    同時,LLVM 的鏈接優化被直接加入到 Apple 的代碼鏈接器上,而 LLVM-GCC 也被同步到使用 GCC4.0 代碼。

    Clang(前端)

    Clang是LLVM 的前端,可以用來編譯 C,C++, 等語言。Clang 則是以 LLVM 為后端的一款高效易用,并且與IDE 結合很好的編譯前端

    make

    ,即自動化編譯腳本,提供了編譯和鏈接的指令,由make工具實現這些指令。中包括了調用gcc或其他編譯器編譯源代碼的命令。

    CMake

    CMake是一個構建生成器,提供了強大的領域特定語言(DSL)來描述構建系統應該實現的功能。這是CMake的主要優勢之一,它允許使用相同的CMake腳本集生成平臺原生構建系統。CMake軟件工具集,使開發人員可以完全控制給定項目的生命周期:

    ? CMake是描述如何在所有主要硬件和操作系統上配置、構建和安裝項目,無論是構建可執行文件、庫,還是兩者都要構建。

    ? CTest定義測試、測試套件,并設置應該如何執行。

    ? CPack為打包需求提供了DSL。

    ? CDash將項目的測試結果在面板中展示。

    .txt

    .txt(組態檔)為cmake提供了生成的指令。類似與make工具的關系。其中組態檔是由人工完成的。

    基本用法 構建和鏈接靜態庫和動態庫

    當有.cpp 和.h文件后, 先把它們編譯成一個庫,而不是直接編譯成可執行文件

    1.創建目標-靜態庫。庫的名稱和源碼文件名相同,如下:

    add_library(message
      STATIC
        Message.hpp
        Message.cpp
      )
    

    2.創建hello-world可執行文件的目標部分不需要修改:

    add_executable(hello-world hello-world.cpp)
    

    3.最后,將目標庫鏈接到可執行目標:

    target_link_libraries(hello-world message)
    

    :順序不要錯

    ( .hpp .cpp) 生成必要的構建指令,將指定的源碼編譯到庫 中。的第一個參數是目標名。整個.txt中,可使用相同的名稱來引用庫。生成的庫的實際名稱將由CMake通過在前面添加前綴lib和適當的擴展名作為后綴來形成 。生成庫是根據第二個參數(或)和操作系統確定的。

    - : 用于創建靜態庫,即編譯文件的打包存檔,以便在鏈接其他目標時使用,例如:可執行文件。

    - : 用于創建動態庫,即可以動態鏈接,并在運行時加載的庫。可以在.txt中使用( .hpp .cpp)從靜態庫切換到動態共享對象(DSO)。

    s

    s(hello-world ): 將庫鏈接到可執行文件。此命令還確保hello-world可執行文件可以正確地依賴于消息庫。因此c標準庫有靜態和動態庫,在消息庫鏈接到hello-world可執行文件之前,需要完成消息庫的構建。

    檢測外部庫:I. 使用pkg-

    1.使用CMake附帶的find-,查找pkg-。這里在中傳遞了QUIET參數。只有在沒有找到pkg-時c標準庫有靜態和動態庫,CMake才會報錯:

    find_package(PkgConfig REQUIRED QUIET)
    

    2.找到pkg-時,我們將使用函數,以搜索任何附帶包配置.pc文件的庫或程序。該示例中,我們查找庫:

    pkg_search_module(
      ZeroMQ
      REQUIRED
          libzeromq libzmq lib0mq
      IMPORTED_TARGET
      )
    

    檢測外部庫:II. 自定義find模塊

    1.將當前源目錄_DIR,添加到CMake將查找模塊的路徑列表中。這樣CMake就可以找到,我們自定義的.cmake模塊:

    list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
    

    2.現在.cmake模塊是可用的,可以通過這個模塊來搜索項目所需的依賴項。由于我們沒有使用QUIET選項來查找,所以當找到庫時,狀態消息將自動打印:

    find_package(ZeroMQ REQUIRED)
    

    3.我們繼續添加可執行目標。頭文件包含目錄和鏈接庫是使用命令成功后,使用和變量進行指定的:

    add_executable(hwserver hwserver.c)
    target_include_directories(hwserver
      PRIVATE
          ${ZeroMQ_INCLUDE_DIRS}
      )
    target_link_libraries(hwserver
      PRIVATE
          ${ZeroMQ_LIBRARIES}
      )
    

    檢查用戶是否為所需的包提供了自定義位置。

    使用find_家族中的命令搜索所需包的必需組件,即頭文件、庫、可執行程序等等。我們使用查找頭文件的完整路徑,并使用查找庫。CMake還提供、和。這些命令的簽名如下:

    find_path(<VAR> NAMES name PATHS paths)
    

    如果搜索成功,將保存搜索結果;如果搜索失敗,則會設置為-。NAMES和PATHS分別是CMake應該查找的文件的名稱和搜索應該指向的路徑。

    初步搜索的結果中,可以提取版本號。示例中,頭文件包含庫版本,可以使用字符串操作和正則表達式提取庫版本信息。

    最后,調用命令。處理命令的、QUIET和版本參數,并設置變量。

    總而言之,有四種方式可用于找到依賴包 使用由包供應商提供CMake文件.cmake ,.cmake和.cmake,通常會在包的標準安裝位置查找。無論是由CMake還是第三方提供的模塊,為所需包使用find-。使用pkg-,如本節的示例所示。如果這些都不可行,那么編寫自己的find模塊。 鏈接自己寫的庫的例子

    寫一個庫,在cmake文件夾下新建一個.cmake的文件。我們的目標是找到庫的頭文件所在目錄和共享庫文件的所在位置。

    # 在指定目錄下尋找頭文件和動態庫文件的位置,可以指定多個目標路徑
    find_path(ADD_INCLUDE_DIR libadd.h /usr/include/ /usr/local/include ${CMAKE_SOURCE_DIR}/ModuleMode)
    find_library(ADD_LIBRARY NAMES add PATHS /usr/lib/add /usr/local/lib/add ${CMAKE_SOURCE_DIR}/ModuleMode)
    if (ADD_INCLUDE_DIR AND ADD_LIBRARY)
        set(ADD_FOUND TRUE)
    endif (ADD_INCLUDE_DIR AND ADD_LIBRARY)
    

    這時我們便可以像引用標準庫一樣引入我們自定義的庫了。

    在.txt中添加

    # 將項目目錄下的cmake文件夾加入到CMAKE_MODULE_PATH中,讓find_pakcage能夠找到我們自定義的函數庫
    set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
    add_executable(addtest addtest.cc)
    find_package(ADD)
    if(ADD_FOUND)
        target_include_directories(addtest PRIVATE ${ADD_INCLUDE_DIR})
        target_link_libraries(addtest ${ADD_LIBRARY})
    else(ADD_FOUND)
        message(FATAL_ERROR "ADD library not found")
    endif(ADD_FOUND)
    

    參考

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有