1. 程式人生 > >linux 把靜態連結庫.a連結到動態連結庫.so裡

linux 把靜態連結庫.a連結到動態連結庫.so裡

個人分類: linux編譯連結

        最近公司的專案中突然出現了這樣一個需求,我簡化再概括後如下:有兩大模組,其中一個模組a最終編譯出一個可執行檔案exec_a,另一個模組b編譯出一個動態連結庫lib_b.so被模組a的程式exec_a所連結。現在模組b中分出一個小模組c,需要獨立成一個專案,它最終生成一個東西,提供給模組b,最後連結成動態庫lib_b.so。因為c將會編譯出多個.o目標檔案,如果提供這些.o給b去連結是沒問題的,但是這樣來說很不人性化。把b和c兩個庫同時提供給a去連結,也能解決,但是偏偏a不希望知道和見到c。

        於是,我的做法如下,把c編譯出一個靜態庫lib_c.a,提供lib_c.a給b去連結,所以就有了一個動態連結庫連結靜態庫的問題了。這個平時用得不多,記錄一下,在連結動態庫b時,連結命令如下(預設大家都懂gcc和Makefile啊):

    $(CC) -shared -o lib_b.so $^ -Wl,--whole-archive -L. -lc -Wl,--no-whole-archive

        從上面這句編譯命令看來就是多了

    -Wl,--whole-archive

       和

    -Wl,--no-whole-archive

        -Wl 都知道是把引數傳遞給連結器,而--whole-archive就是可以把在這個引數之後的靜態庫中的函式和變數輸出到動態庫中,而--no-whole-archive則是關掉這個功能。

        否則如果只是單純地連結一個.a到.so中的話,這個動態庫是不會有任何靜態庫中的內容的,最後連結到可執行檔案時,也會出現找不到靜態庫中的內容。

        還有值得注意的就是,我習慣了每次編譯後的release版本都strip一下,如果直接對剛剛編譯出來的靜態庫strip操作的話,這個靜態庫就啥都沒有了,因為它的東西沒被任何東西所使用,所以全部被去掉了。之前因為這個問題折騰了半天還以為仍然是沒有把這個靜態庫導到動態庫去。

        本文到此結束!