我在centos7上的测试:
makefile文件
all: test static_main
CC=gcc
Q=
E=echo
%.o: %.c
$(Q)$(CC) -c -o $@ $(CFLAGS) $<
$(Q)$(E) " CC " $<
libdyn.so:dyn.o
$(CC) -shared -fPIC -o $@ dyn.o
libsta.a: static.o
$(Q)$(AR) rcs $@ static.o
test: libsta.a libdyn.so a.o
$(CC) -Wl,-rpath=$(PWD) -o $@ a.o -L./ -ldyn -lsta ##版本比较高的GCC可不使用-Bstatic来指定。# is ok
#$(CC) -Wl,-rpath=$(PWD) -L./ -Wl,-Bdynamic -ldyn -Wl,-Bstatic -lsta -o $@ a.o # is not ok
#$(CC) -Wl,-rpath=$(PWD) -Wl,-Bstatic -lsta -L./ -Wl,-Bdynamic -ldyn -o $@ a.o is not ok
#$(CC) -o $@ a.o -Wl,-rpath=$(PWD) -Wl,-Bstatic -lsta -L./ -Wl,-Bdynamic -ldyn # is ok
## -o xxxxx 在前,-Wl,-Bstatic ......在后。
#gcc -v -Wl,-rpath=$(PWD) -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o $@ a.o -L./ -Wl,-Bstatic -lsta -Wl,-Bdynamic -ldyn # is ok
#gcc -v -Wl,-rpath=$(PWD) -o $@ a.o -L./ -Wl,-Bstatic -lsta -Wl,-Bdynamic -ldyn # is ok
## 遇到问题,使用gcc -v来查看一些详细的信息。
static_main: b.o libsta.a
gcc -v -Wl,-rpath=$(PWD) -o $@ b.o -L./ -Wl,-Bstatic -lsta -Wl,-Bdynamic # is ok
## -Wl,-Bstatic {xxxx} -Wl,-Bdynamic, 这两个参数要成对出现,-Wl,-Bstatic 表示在此之后的所有的-lXX全使用静态库,而还需要连接一些是隐性的(动态)库如libc, 所以使用 -Wl,-Bdynamic,告诉GCC在此之后全使用动态库。两者成对出现明确告诉GCC使用的静态库,默认全是动态库。
#gcc -Wl,-rpath=$(PWD) -L./ -Wl,-Bstatic -lsta -Wl,-Bdynamic -o $@ $< # is not ok
#gcc -Wl,-rpath=$(PWD) -L./ -Wl,-Bstatic -lsta -Wl,-Bdynamic -o $@ $^ # is ok
##一行 -o b.o libsta.a这是可行的。-o libsta.a b.o这样写不可行。
#gcc -o $@ $^ # ok
clean:
rm test static_main *.o *.a *.so -rf
-----------------------------------------------
a.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/errno.h>
#include "sta.h"
extern char* dyn;
extern char* sta;
void main(void)
{
printf("%s \n",dyn);
printf("%s \n",sta);
}
--------------------------------------------------------------
b.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/errno.h>
#include "sta.h"
extern char* sta;
void main(void)
{
printf("%s \n",sta);
}
-------------------------------------------------------------
static.c
#include "sta.h"
int static_a=9;
char* sta="I am a static lib";
-------------------------------------------------------------
dyn.c
char* dyn="I am a dynamic lib";
参考: