构建.so和.a库时有什么不同的标志吗?

时间:2014-02-06 16:41:38

标签: gcc makefile

我知道共享库静态库之间的区别。我试图找出不同的 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)

1 个答案:

答案 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可以选择创建一个瘦存档,其中包含一个符号索引和对存档成员文件的原始副本的引用。这对于构建在本地构建树中使用的库非常有用,其中可重定位对象应该保持可用,并且复制每个对象的内容只会浪费时间和空间。


防止构建损坏的最佳实践是将所有编译器选项(例如CPPFLAGSCXXFLAGS)放在单独的.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,$^)