LINUX 動態庫編譯和使用的注意事項

2021-08-11 06:04:04 字數 1659 閱讀 2728

下面是動態庫編譯的指令碼編寫

$(dlltarget): $(libobjs)

$(cc) -shared

-fpic $(cxxflags) -wl,--whole-archive $(ldlibs) $(libobjs) -wl,-no

-whole

-archive

-wl,--retain-symbols

-file

=exports.

map-wl,--version-script

=exports.

map-o $@

幾點注意:

1. 對於引用的靜態庫,通過-wl,–whole-archive命令嵌入進來,後面執行就不依賴於這些靜態庫了。

2. linux預設匯出所有符號,這個容易引起符號衝突。可以通過-fvisibility=hidden -fvisibility-inlines-hidden,這個我在簡單的demo裡面可以用,真正的工程裡面死活不行,而且理論上來說對於依賴的其他靜態庫是沒用的,這份方案後來放棄了。用–retain-symbols-file –version-script方案,這個很好用,只在exports.map裡面輸入要匯出的符號就可以。

exports.map的例子:

;
$(

exec):

$(objs) $(

p_outlib)/libbasictool.a $(

p_outlib)/lib*******.so

$(cpp) $(

cflags) -o $@

$(objs) -l

$(p_outlib) -lbasictool -lresolv -lrt -l******* -lpthread

幾點注意:

1. cflags不能加-static

要先解壓,然後一起合併。

ldlibs = libbasictool.a \

libnetwork.a \

libdynastruct2.a \

libtinyxml.a

libsobjs = ./build_tmp/libbasictool.a/*.o \

./build_tmp/libnetwork.a/*.o \

./build_tmp/libdynastruct2.a/*.o \

./build_tmp/libtinyxml.a/*.o

$(libtarget):

$(libobjs)

rm -rf build_tmp

mkdir build_tmp

@for lib in

$(ldlibs); do \

mkdir build_tmp/$$lib;\

cd build_tmp/$$lib;\

$(ar) x $(

p_outlib)/$$lib;\

cd ../..;\

done

$(ar) rsuv $(

libtarget) $(

libsobjs) $(

libobjs)

ranlib $(

libtarget)

rm -rf build_tmp

linux 靜態庫與動態庫的編譯和使用

gcc o test.o test.c 將.c檔案編譯成.o ar xv libtest.a 靜態庫解包 ar rv libtest.a o 將.o檔案編譯成.a,用 o可以將所有.o檔案編譯成乙個.a gcc shared o test.so o 將.o檔案編譯成.so,用 o可以將所有.o檔案編...

Linux編譯動態鏈結庫和使用

1 編譯動態鏈結庫,將lib a.c和lib b.c編譯成動態庫 lib common.h ifndef lib common h define lib common h void liba printf void libb printf endiflib a.c include include l...

linux動態庫的編譯與使用

linux下的動態庫以.so為字尾,我也是初次在linux下使用動態庫,寫一點入門步驟,以便以後能方便使用。第一步 編寫linux程式庫 檔案1.動態庫介面檔案 動態庫介面檔案getmaxlen.h ifndef getmaxlen h define getmaxlen h int getmaxle...