1. 程式人生 > >如何使用cmake生成基於靜態庫的動態連結庫

如何使用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中
)