创建一个项目,从Makefile到UNIX中的静态/动态库

时间:2009-03-01 00:13:30

标签: c++ c makefile unix

大家,您能在unix上描述一些关于c ++构建块的内容吗?

我想创建一个链接静态库和动态库(.so)的应用程序。

问题1: 如何使用gcc / g ++创建静态库?如何使用我的应用程序链接。

问题2: 如何在makefile中指定它,链接静态和动态库,假设两个库都有头文件

总结:我一直在使用makefile和库多年,由其他人编写。因此,每当我修改它时,我只是简单地剪切粘贴的东西,而不是真正理解它。现在我想深入了解构建/链接/创建Makfile过程。

在私密细节中描述这些概念的好书是什么?

由于

6 个答案:

答案 0 :(得分:15)

静态库通常使用ar命令归档。构建完所有目标文件后(最好使用GCC上的-fPIC开关),您可以像这样运行ar

ar -rs archivename.a list.o of.o objects.o

man页面描述了选项。

动态库的构建通常是-shared切换到gccld,输出文件名改为.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)