转自gcc和ld 中的参数 --whole-archive 和 --no-whole-archive
首先 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加-Wl,字串。
--whole-archive 可以把 在其后面出现的静态库包含的函数和变量输出到动态库,--no-whole-archive 则关掉这个特性。
比如你要把 liba.a libb.a libc.a 输出到 libabc.dll(或libabc.so)时应该这么写:
libabc.dll:liba.c libb.a libc.a
gcc -shared -o $@ -L. -Wl,--whole-archive -la -lb -lc -Wl,--no-whole-archive
在--whole-archive作用下的库里不能有函数同名。
下面有一个包含Makefile 和c的完整例子:
#dllMake all:ap lib exe=main.exe dll=libabc.dll lib:$(dll) ap:$(exe) src=main sa = a b c $(exe):$(src:%=%.c) $(dll) gcc $< -labc -L. -o $@ $(dll):$(sa:%=lib%.a) gcc -shared -o $@ -L. -Wl,--whole-archive $(sa:%=-l%) -Wl,--no-whole-archive lib%.a:%.o ar rcs $@ $< %.o:%.c gcc $< -g -c -o $@ clean: # -rm $(sa:%=%.o) # -rm $(src:%=%.o) -rm $(sa:%=lib%.a) -rm $(dll) -rm $(exe)
//a.c #include <stdio.h> int func_a(int arg1) { printf("a %d " , arg1); return 25*arg1; } int samefun() { printf("%s in %s ", __FUNCTION__ , __FILE__ ) ; } // b.c #include <stdio.h> int func_b(int arg1) { return 2*arg1; } // c.c #include <stdio.h> int func_c(int arg1) { return 3*arg1; } //main.c #include <stdio.h> int main() { int arg = 412; int res ; printf("start "); res = func_a(arg)+func_b(arg)+func_c(arg); printf(" %d => %d " , arg , res ); samefun(); return res; }