簡體   English   中英

如何在 cmake 中構建參數化的第三方庫?

[英]How do I build a parameterized third-party library in cmake?

我有一個項目,其中我有一個第三方庫作為 git 子模塊簽出。 第三方庫只是沒有構建系統的源代碼。 此外,第三方庫必須通過編譯器定義在每個可執行的基礎上進行配置,並有選擇地只編譯我需要的庫的部分。 我在很多不同的存儲庫中使用這個庫,所以我想制作一個可重用的組件來為任何特定的可執行文件生成庫的實例化。

我目前嘗試的方法是創建一個generate_thirdparty.cmake<\/code> 。 這個文件看起來像這樣:

function(generate_thirdparty parameters)
    # several calls to add_library for the different components of this third party library
    # the generated libraries depend on the parameters argument
    # the parameters configure compile definitions and which source files are compiled
endfunction()

讓我們總結一下:

  1. 第三方庫不<\/em>提供自己的構建。<\/li>
  2. 您需要在單個構建中對庫進行許多實例化。<\/li>
  3. 您可以在多個不同的存儲庫中使用這些實例化。<\/li><\/ol>

    我認為你幾乎采取了正確的方法。 為簡潔起見,我們將第三方庫libFoo<\/code> 。 這是我認為你應該做的...

    1. libFoo<\/code>創建一個包裝<\/em>存儲庫,其中包含一個FindFoo.cmake<\/code>文件和它旁邊的實際foo<\/code>存儲庫子模塊。 這是為了避免FindFoo.cmake<\/code>的內容在您的各個項目中獨立進行版本控制。<\/li>
    2. 包裝器<\/em>作為子模塊包含在依賴項目中,例如在目錄third_party\/foo_wrapper<\/code><\/li>
    3. 在那些依賴項目中,寫:<\/li><\/ol>
       FindFoo.cmake<\/code>的內容將是:<\/li><\/ol>
       cmake_minimum_required(VERSION 3.18) function(generate_foo target) # Use CMAKE_CURRENT_FUNCTION_LIST_DIR to reference foo's source files # for example: set(sources "src\/src1.cpp" "src\/src2.cpp" ...) list(TRANSFORM sources PREPEND "${CMAKE_CURRENT_FUNCTION_LIST_DIR}\/foo\/") add_library(${target} ${sources}) add_library(foo::${target} ALIAS ${target}) # Do other things with ARGN endfunction() # Define a version for this dependency + script combo. set(Foo_VERSION 0.1.0) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Foo VERSION_VAR Foo_VERSION HANDLE_COMPONENTS)<\/code><\/pre>

      CMAKE_CURRENT_FUNCTION_LIST_DIR<\/code>是包含被調用函數的文件的絕對路徑。 請記住,這是包裝<\/em>存儲庫的根目錄,因此libFoo<\/code>的實際源代碼將位於相鄰的foo<\/code>目錄中。 list(TRANSFORM)<\/code>讓我們在源列表中寫入相對路徑,這些相對路徑為了add_library<\/code>而被轉換為絕對路徑(將相對路徑傳遞給add_library<\/code>將相對於調用者的<\/em>源目錄)。

      我還創建了一個ALIAS<\/code>目標,以便generate_foo<\/code>的調用者可以鏈接到別名。 這很重要,因為 CMake 將包含::<\/code>的名稱視為預期庫時的目標。 這非常有助於將意外鏈接器標志中的拼寫錯誤轉變為配置時“未找到目標”錯誤。

      然后我們像正常一樣定義函數並調用find_package_handle_standard_args<\/code>來處理find_package<\/code>參數,如REQUIRED<\/code> 、 COMPONENTS<\/code> (甚至只是檢查沒有錯誤指定)和VERSION<\/code> 。 在此處查看文檔: https<\/a> :\/\/cmake.org\/cmake\/help\/latest\/module\/FindPackageHandleStandardArgs.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM