如何使用cmake生成基於靜態庫的動態連結庫
阿新 • • 發佈:2019-02-11
在工程搭建時,可能會有將靜態庫連結成動態庫的需求,如出於程式碼保護的角度,某些模組會發布.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中
)