伙计们,你会在unix上描述一些关于c ++构建块的事情吗?
我想创建一个链接静态库和动态库(.so)的应用程序.
问题1: 如何使用gcc/g ++创建静态库?如何使用我的应用程序链接.
问题2: 如何在makefile中指定它,链接静态和动态库,假设两个库都有头文件
简介:我一直在使用makefile和库多年,由其他人编写.因此,每当我修改它时,我只是简单地剪切粘贴的东西,而不是真正理解它.现在我想深入了解构建/链接/创建Makfile过程.
在私密细节中描述这些概念的好书是什么?
谢谢
静态库通常使用该命令存档ar
.一旦你构建了所有目标文件(最好使用-fPIC
GCC 上的开关),你可以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
存档的适当绝对路径来链接静态库.
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的裸机Makefile为静态链接到library.a的应用程序baz.cpp:
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)
动态图书馆离开了,咳咳,作为读者的练习.