在工程搭建時,可能會有將靜態庫鏈接成動態庫的需求,如出於代碼保護的角度,某些模塊會發布.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中
)