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