这个问题的原因在于编译器在生成共享库时可能会包含一些默认的符号。可以通过在编译时使用-fvisibility=hidden标志来强制编译器对库中所有符号进行隐藏,以避免生成重复的共享库。
下面是一个示例C程序,它将链接到一个共享库中:
// example.c
#include
void hello() {
printf("Hello, World!\n");
}
下面是一个Makefile,用于编译共享库:
CC=gcc
CFLAGS=-fPIC
libexample.so: example1.o example2.o
$(CC) -shared -o $@ $^
example1.o: example.c
$(CC) $(CFLAGS) -c $< -o $@
example2.o: example.c
$(CC) $(CFLAGS) -c $< -o $@
由于Makefile中example1.o和example2.o都使用相同的example.c源文件,因此将生成两个完全相同的共享库。
要解决此问题,可以使用-fvisibility=hidden标志,如下所示:
CC=gcc
CFLAGS=-fPIC -fvisibility=hidden
libexample.so: example1.o example2.o
$(CC) -shared -o $@ $^
example1.o: example.c
$(CC) $(CFLAGS) -c $< -o $@
example2.o: example.c
$(CC) $(CFLAGS) -c $< -o $@
现在,即使使用相同的源文件编译example1.o和example2.o,也会生成两个不同的库。