如何使用cmake生成基於靜態庫的動態鏈接庫


在工程搭建時,可能會有將靜態庫鏈接成動態庫的需求,如出於代碼保護的角度,某些模塊會發布.a擴展名的靜態庫,我們要將多個這樣的靜態庫鏈接成一個動態庫。但與直接link目標文件不同的是,ld以默認參數執行時,並把靜態庫中沒有用到的函數過濾掉,導致生成的so並未包含所要的函數,因此要加上--whole-archive參數,以保證所有的函數都包含在生成的so中。

    在使用cmake時,CMakeLists.txt的寫法如下:

add_library(
    ${MODULE_NAME}
    SHARED
    ${CMAKE_SOURCE_DIR}/builttime.c #要生成一個so,至少要包含一個源文件,實在沒有可以把庫的編譯時間戳打到這兒。
)

target_link_libraries(
    ${MODULE_NAME}
    ${${MODULE_NAME}_EXTRA_LDFLAGS}
    "-Wl,--whole-archive" #告訴編譯器,從這里開始,所有的庫的內容都包含到so中
    ${LOCAL_MODULES} #可以是以源代碼生成的靜態庫
    ${PREBUILT_MODULES} #可以是預先生成的靜態庫
    "-Wl,--no-whole-archive" #告訴編譯器,從這里開始,以后的庫的內容不用都包含到so中
)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM