Hi community,

I try to follow make manual sec. 11.3 to build static archive library. 


When I delete a source file and its object file and run make to build the 
archive again, the deleted object remains in the archive.
Should not the archive have less members when it is built from less objects?


I add ` rm -f $@ ` in the recipe but do not know if it is the right solution.


Thanks.


~(%): % ;
~%.a:
~ rm -f $@
~ $(AR) $(ARFLAGS) $@ $?
~lib$(target).a: lib$(target).a($(patsubst %$(ext),%.o,$(wildcard *$(ext))))




test:


$ make -C src 
cc -Wall -Wextra -fPIC -O3 -MMD -MP -c -o foo.o foo.c
cc -Wall -Wextra -fPIC -O3 -MMD -MP -c -o bar.o bar.c
cc -shared -Wl,-soname,libfoo.so.1 foo.o bar.o -o foo
cp foo libfoo.so.1.2.3
ln -fs libfoo.so.1.2.3 libfoo.so.1
ln -fs libfoo.so.1 libfoo.so
rm -f libfoo.a
ar rvU libfoo.a bar.o foo.o
ar: creating libfoo.a
a - bar.o
a - foo.o
cc -Wall -Wextra -O3 -MMD -MP -I../foo -c -o main.o main.c
cc -L../foo -Wl,-rpath,'$ORIGIN/../foo:$ORIGIN/../lib' main.o -lfoo -o main
$ 


$ ar -tv src/foo/libfoo.a 
rw-rw-r-- 1000/1000 1640 Feb 10 10:58 2026 bar.o
rw-rw-r-- 1000/1000 1640 Feb 10 10:58 2026 foo.o
$ 


$ rm src/foo/bar.o src/foo/bar.d
$ mv src/foo/bar.c src/foo/bar-c 
$ touch src/foo/foo.h 


$ make -C src 
cc -Wall -Wextra -fPIC -O3 -MMD -MP -c -o foo.o foo.c
cc -shared -Wl,-soname,libfoo.so.1 foo.o -o foo
cp foo libfoo.so.1.2.3
ln -fs libfoo.so.1.2.3 libfoo.so.1
ln -fs libfoo.so.1 libfoo.so
rm -f libfoo.a
ar rvU libfoo.a foo.o
ar: creating libfoo.a
a - foo.o
cc -Wall -Wextra -O3 -MMD -MP -I../foo -c -o main.o main.c
main.c: In function ??main??:
main.c:11:10: warning: unused variable ??ret?? [-Wunused-variable]
 11 | bool ret = add(a, b, &sum);
 | ^~~
cc -L../foo -Wl,-rpath,'$ORIGIN/../foo:$ORIGIN/../lib' main.o -lfoo -o main
$ 


$ ar -tv src/foo/libfoo.a 
rw-rw-r-- 1000/1000 1640 Feb 10 10:58 2026 foo.o
$ 


$ make --version
GNU Make 4.4.1
$

Reply via email to