/usr/lib64 /usr/lib /lib64 /lib # kernel 的函式庫放在 /lib/modules
[root@linux ~]# ldd [-vdr] [filename] 選項: --version :列印 ldd 的版本序號 -v :列出所有內容資訊; --help :指令用法資訊
[root@linux ~]# ldd /usr/bin/passwd
linux-gate.so.1 => (0x00d19000)
.......中間省略......
libpam_misc.so.0 => /lib/libpam_misc.so.0 (0x00bd6000)
.......中間省略......
[root@linux ~]# ldd /lib/libc.so.6
/lib/ld-linux.so.2 (0x00bf1000)
linux-gate.so.1 => (0x00632000)
[root@linux ~]# ldd -v /lib/libc.so.6
/lib/ld-linux.so.2 (0x00bf1000)
linux-gate.so.1 => (0x00111000)
Version information:
/lib/libc.so.6:
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
[root@test root]# ldconfig [-f conf] [-C cache] [-p] 參數說明: -f conf :conf 預設為 /etc/ld.so.conf -C cache:cache 預設為 /etc/ld.so.cache -p :列出目前在 cache 內的資料
[root@dywHome2 ~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/X11R6/lib
/usr/lib/qt3/lib
[root@dywHome2 ~]# ldconfig -p | grep "libafb"
[root@dywHome2 ~]# vi /etc/ld.so.conf
[root@dywHome2 ~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/X11R6/lib
/usr/lib/qt3/lib
/usr/lib/xorg/modules # 加入此行
[root@dywHome2 ~]# ldconfig
[root@dywHome2 ~]# ldconfig -p | grep "libafb"
libafb.so (libc6) => /usr/lib/xorg/modules/libafb.so
$ cc -c 2.c # 產生 2.o $ cc -c 3.c # 產生 3.o $ ar rv mylib.a 2.o 3.o # 將目標檔 2.o 及 3.o 插入到函式庫 mylib.a # 選項 r :在函式庫中插入目標檔。當插入的目標檔名已在庫中存在,則替換。 # 選項 v :顯示執行操作選項的附加信息。
$ nm mylib.a
.c.a: $(CC) -c $(CFLAGS) $< $(AR) $(ARFLAGS) $@ $*.o # 變數 $(AR) 和 $(ARFLAGS),一般分別為命令 ar 和選項 rv。
$< 代表目前的相依性項目,就是 bas.c。
$@ 代表目前的目標項目,就是 fud.a 函式庫。
$* 代表目前的相依性項目,不過不含副檔名,就是 bas。
all: myapp
# Which compiler
CC = gcc
# Where to install
INSTDIR = /usr/local/bin
# Where are include files kept
INCLUDE = .
# Options for development
CFLAGS = -g -Wall -ansi
# Options for release
# CFLAGS = -O -Wall -ansi
# Local Libraries
MYLIB = mylib.a
myapp: main.o $(MYLIB)
$(CC) -o myapp main.o $(MYLIB)
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
clean:
-rm main.o 2.o 3.o $(MYLIB)
install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
$ rm -f myapp *.o mylib.a $ make -f Makefile5 gcc -g -Wall -ansi -c -o main.o main.c gcc -g -Wall -ansi -c -o 2.o 2.c ar rv mylib.a 2.o a - 2.o gcc -g -Wall -ansi -c -o 3.o 3.c ar rv mylib.a 3.o a - 3.o gcc -o myapp main.o mylib.a
$ touch c.h $ make -f Makefile5 gcc -g -Wall -ansi -c -o 3.o 3.c ar rv mylib.a 3.o r - 3.o gcc -o myapp main.o mylib.a $
mylib.a:
(cd mylibdirectory;$(MAKE))
.c.o:
$(CC) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F)
# 在子目錄中編譯檔案,並將編譯完的目的檔留在子目錄中。
$(@D) 代表目前的目標項目所在目錄,就是 mydir。
$(<F) 代表目前的相依性項目的檔案名稱,就是 2.c。
$(@F) 代表目前的目標項目的檔案名稱,就是 2.o。
mylib.a: mydir/2.o mydir/3.o
ar rv mylib.a $?
# $? 代表需要重建的相依性項目,就是 mydir/2.o 及(或) mydir/3.o
練習題
$<, $@, $* 分別為何?
.c.a: $(CC) -c $(CFLAGS) $< $(AR) $(ARFLAGS) $@ $*.o # 變數 $(AR) 和 $(ARFLAGS),一般分別為命令 ar 和選項 rv。
$< 代表目前的相依性項目,就是 bas.c。 2.$@ 代表目前的目標項目,就是 fud.a 函式庫。 3.$* 代表目前的相依性項目,不過不含副檔名,就是 bas。
$(CC) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F) 中的變數 $(@D), $(<F), $(@F) 分別為何?
$(@D) 代表目前的目標項目所在目錄,就是 mydir。 2.$(<F) 代表目前的相依性項目的檔案名稱,就是 2.c。 3.$(@F) 代表目前的目標項目的檔案名稱,就是 2.o。
Next: 撰寫使用者手冊
Up: 開發工具 - makefile 其他功能
Previous: Makefile 其他法則
Contents
2017-06-14