Posted on 2018-11-28 14:35
Prayer 閱讀(559)
評論(0) 編輯 收藏 引用 所屬分類:
LINUX/UNIX/AIX 、
makefile
http://blog.sina.com.cn/s/blog_5e4b74040102x19u.html
由于單位的項目需要,要把Linux和AIX環境下的靜態庫編譯為動態庫,現總結一下整個編譯的過程及重點注意事項。
linux下的靜態庫文件編譯makefile如下:
INCLUDE= \
-I/libpath/hdf5-1.8.9/include/ -I/libpath/include -I/libpath/hdf5
all: libname.a
libname.a: zhdf.o
ar -r libname.a zhdf.o
zhdf.o: ../zhdf.cpp
g++ $(INCLUDE) -Wall -g -c -lm ../zhdf.cpp -o zhdf.o
.PHONY: clean
clean:
rm -rf *.o libname.a
linux下的動態庫文件編譯makefile如下:
INCLUDE= \
-I/libpath/hdf5-1.8.9/include/ -I/libpath/include -I/libpath/hdf5
all: libname.so
libname.so: zhdf.o
g++ -shared zhdf.o -o libname.so
zhdf.o: ../zhdf.cpp
g++ $(INCLUDE) -Wall -g -c -fPIC -lm ../zhdf.cpp -o zhdf.o
.PHONY: clean
clean:
rm -rf *.o libname.so
區別主要是動態庫編譯時makefile需要-shared和-fPIC選項,另外,動態庫編譯成功后,需要進入使用該庫的用戶/home/user路徑下,vi .bashrc文件,用export指令將動態庫的路徑加入環境變量,如export LD_LIBRARY_PATH=yourlibpath,然后source .bashrc進行環境變量修改的保存,保存后可用env查看環境變量是否修改成功。以上,LINUX環境下動態庫的編譯就算完成啦!
AIX下的靜態庫文件編譯makefile如下:
INCLUDE= \
-I/libpath/hdf5-1.8.9/include/ -I/libpath/include -I/libpath/hdf5/ \
all: libname.a
libname.a: zhdf.o
ar -X64 -r libname.a zhdf.o
zhdf.o: ../zhdf.cpp
xlC $(INCLUDE) -q64 -qinfo -g -c -lm ../zhdf.cpp -o zhdf.o
.PHONY: clean
clean:
rm -rf *.o libname.a
AIX下的動態庫文件編譯makefile如下:
INCLUDE= \
-I/libpath/hdf5-1.8.9/include/ -I/libpath/include -I/libpath/hdf5/ \
all: libname.so
llibname.so: zhdf.o
xlC $(INCLUDE) -q64 -bnoentry -qmkshrobj -blazy -G -o libname.so ../zhdf.cpp -lc
zhdf.o: ../zhdf.cpp
xlC $(INCLUDE) -q64 -c -lm ../zhdf.cpp -o zhdf.o
.PHONY: clean
clean:
rm -rf *.o libname.so
AIX環境下動態庫和靜態庫的編譯主要區別是動態庫使用-qmkshrobj進行動態庫的編譯,對應Linux環境下的-shared選項,動態庫編譯成功后,需要進入使用該庫的用戶/home/user路徑下,vi .profile文件,用export指令將動態庫的路徑加入環境變量,如export LIBPATH=yourlibpath,然后用. .profile完成對環境變量修改的保存,保存后可通過echo $LIBPATH查看是否添加成功。最后,由于AIX環境下動態庫的編譯機制問題,應用程序查找動態庫時,會去查找一個同名的.a文件。所以,很多人動態庫編譯成功,應用程序編譯時卻無法找到該動態庫。解決辦法是,在動態庫的路徑下,創建一個同名.a的連接,如ln -s libname.so libname.a。以上,AIX環境下動態庫的編譯也完成啦!