我知道共享库和静态库之间的区别。我试图找出不同的 gcc标志/选项来在linux上构建它们。我有一个人的 makefile ,它会创建一个 .so 文件。我刚刚更改了输出文件名的扩展名。然后我获得静态库文件, .a 文件。我测试了它。有效。
我认为可能不那么简单。可能还有一些我需要改变的地方。我不仅要求这个案子。我总体上问,构建 .so 时以及构建 .a 时,选项/标记是否有任何区别。
原始命令是:
CFLAGS= $(INCLUDE) $(WARN) -Wall
libMyLibrary.so: MyLibrary.c MyLibrary.h
$(CC) -fPIC -o $(LIB_SRC_ROOT)/libMyLibrary.so -shared MyLibrary.c $(CFLAGS)
答案 0 :(得分:2)
要构建共享库,您需要链接ld
或编译器(假设使用gcc
和GNU make):
gcc -shared -o $@ $(filter %.o,$^)
使用ar
构建静态库:
ar cr $@ $(filter %.o,$^)
在上面的$(filter %.o,$^)
静态库只是一个文件中的一堆.o
个文件。因此,当您构建一个文件时,您将拥有原始.o
文件及其副本.a
。如果您不打算重新分发.a
文件,您可能会喜欢GNU ar瘦存档功能:
GNU ar可以选择创建一个瘦存档,其中包含一个符号索引和对存档成员文件的原始副本的引用。这对于构建在本地构建树中使用的库非常有用,其中可重定位对象应该保持可用,并且复制每个对象的内容只会浪费时间和空间。
防止构建损坏的最佳实践是将所有编译器选项(例如CPPFLAGS
和CXXFLAGS
)放在单独的.mk
makefile和链接器选项中(例如{{1}在另一个。然后,LDFLAGS
个文件也依赖于.o
;可执行文件,共享库和归档也依赖于compiler_flags.mk
。因此,当编译器或链接器标志更新时,linker_flags.mk
会自动重新编译和/或重新链接目标,例如:
make
这解释了为什么这些规则中有xyz.so : x.o y.o z.o linker_flags.mk
g++ -shared -o $@ ${LDFLAGS} $(filter %.o,$^)
x.o : x.cc compiler_flags.mk
g++ -c -o $@ ${CPPFLAGS} ${CXXFLAGS} $(filter %.cc,$^)
。