大家,您能在unix上描述一些关于c ++构建块的内容吗?
我想创建一个链接静态库和动态库(.so)的应用程序。
问题1: 如何使用gcc / g ++创建静态库?如何使用我的应用程序链接。
问题2: 如何在makefile中指定它,链接静态和动态库,假设两个库都有头文件
总结:我一直在使用makefile和库多年,由其他人编写。因此,每当我修改它时,我只是简单地剪切粘贴的东西,而不是真正理解它。现在我想深入了解构建/链接/创建Makfile过程。
在私密细节中描述这些概念的好书是什么?
由于
答案 0 :(得分:15)
静态库通常使用ar
命令归档。构建完所有目标文件后(最好使用GCC上的-fPIC
开关),您可以像这样运行ar
:
ar -rs archivename.a list.o of.o objects.o
man
页面描述了选项。
动态库的构建通常是-shared
切换到gcc
或ld
,输出文件名改为.so
。
Autotools使用libtool
程序处理此问题。我对它的使用并不熟悉。
可以通过列出带有-l
(ell)开关的库(例如-lX
链接到libX.so
)或直接用绝对值指定它们来链接这些库。路径(例如将/usr/lib/libX.so
添加到您的命令中)。通过在-static
之前指定-l
或指向.a
存档的相应绝对路径来链接静态库。
答案 1 :(得分:11)
Bare bones Makefile用于创建一个静态库,包含foo.cpp中的代码,bar.cpp:
PROJECT = library.a
OBJECTS = foo.o bar.o
CFLAGS = -Wall -pedantic
all: $(PROJECT)
.cpp.o:
g++ -c $(CFLAGS) $<
$(PROJECT): $(OBJECTS)
libtool -o $(PROJECT) -static $(OBJECTS)
Bare.cones为一个应用程序baz.cpp的Makefile,它是指向library.a的静态链接:
PROJECT = baz
CFLAGS = -Wall -pedantic
OBJECTS = baz.o
all: $(PROJECT)
.cpp.o:
g++ -c $(CFLAGS) $<
$(PROJECT): $(OBJECTS) library.a
g++ $(OBJECTS) -L. -llibrary -o $(PROJECT)
动态图书馆离开,哼,作为读者的练习。
答案 2 :(得分:2)
答案1:要从源文件foo.c和bar.c创建静态库,请执行以下操作:
gcc -c foo.c
gcc -c bar.c
ar rc mylibrary.a foo.o bar.o
有关此内容的更多信息,请阅读GCC manual 手册学习如何使用编译器,以及通过编译器的链接器。该 binutils manual也应该 很有帮助。
答案2:GNU Make manual很漂亮 好。要真正了解库及其工作原理,请阅读连接器和加载器 约翰R.莱文的书。
静态库非常简单,但共享库可能非常多毛,具体取决于 在平台上以及您想要和需要的可移植性。作为一个例子,在 某些系统必须使用不同的选项编译静态和共享库 正常工作(一个必须,另一个不能与位置无关编译 码)。已经开发了整个实用程序框架以使这更容易(libtool), 但他们自己并不是没有问题的。
答案 3 :(得分:0)
由于你引用了gcc,我假设你正在使用GNU Make。我找到的最好的文档是official manual,它以易于理解的术语涵盖了您需要知道的所有内容。
答案 4 :(得分:0)
当我学习Linux编程时,Advanced Linux Programming对我帮助很大。您可以在this pdf中查看“编写和使用库”部分。它解释了Linux中的库。
答案 5 :(得分:-1)