下面是動態庫編譯的指令碼編寫
$(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...