Gcc 构建库时是否有不同的标志?

Gcc 构建库时是否有不同的标志?,gcc,makefile,Gcc,Makefile,我知道共享库和静态库之间的区别。我试图找出不同的gcc标志/选项来在linux上构建它们。我有一个人的生成文件,它创建了一个。所以文件。我刚刚更改了输出文件的扩展名。然后我得到静态库文件,一个.a文件。我测试过了。成功了 我想可能没那么简单。我可能还需要改变一些事情。我不仅仅是在问这个案子。一般来说,我会问,当构建时,选项/标志是否有任何差异。因此,当构建时,选项/标志是否有任何差异。a 原始命令如下所示: CFLAGS= $(INCLUDE) $(WARN) -Wall libMyLibr

我知道共享库静态库之间的区别。我试图找出不同的gcc标志/选项来在linux上构建它们。我有一个人的生成文件,它创建了一个。所以文件。我刚刚更改了输出文件的扩展名。然后我得到静态库文件,一个.a文件。我测试过了。成功了

我想可能没那么简单。我可能还需要改变一些事情。我不仅仅是在问这个案子。一般来说,我会问,当构建时,选项/标志是否有任何差异。因此,当构建时,选项/标志是否有任何差异。a

原始命令如下所示:

 CFLAGS= $(INCLUDE) $(WARN) -Wall

libMyLibrary.so: MyLibrary.c MyLibrary.h
    $(CC) -fPIC -o $(LIB_SRC_ROOT)/libMyLibrary.so -shared              MyLibrary.c $(CFLAGS)

要构建共享库,您需要链接到
ld
或您的编译器(假设使用了
gcc
和GNU make):

要构建静态库,请使用
ar

ar cr $@ $(filter %.o,$^)
在上面的
$(过滤器%.o,$^)


静态库只是一个文件中的一堆
.o
文件。因此,当您构建一个时,您将在
.a
中拥有原始的
.o
文件及其副本。如果您不打算重新分发
.a
文件,您可能会喜欢GNU ar精简归档功能:

GNU ar可以选择性地创建精简归档,其中包含一个符号索引和对归档的成员文件的原始副本的引用。这对于构建在本地生成树中使用的库非常有用,在本地生成树中,可重新定位的对象将保持可用,复制每个对象的内容只会浪费时间和空间


防止损坏版本的最佳实践之一是将所有编译器选项(例如,
CPPFLAGS
cxflags
)放在一个单独的
.mk
makefile中,并将链接器选项(例如,
LDFLAGS
)放在另一个选项中。然后have
.o
文件也依赖于
编译器标志.mk
;可执行文件、共享库和归档文件也依赖于
linker\u 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,$^)
这解释了为什么在这些规则中有
$(filter…,$^)

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,$^)