Linux-(CC++)⽣成并使⽤静态库动态库静态库/动态库概要
在Windows下静态库的后缀为:.lib、动态库后缀为:.dll;⽽在Linux下静态库的后缀为:.a、动态库的后缀为:.so。
那么什么是静态库呢?
⾸先我们来看看程序编译的⼤体流程:预处理——编译——汇编——链接
在我们的项⽬开发中,有些代码会被反复使⽤,那么这时我们便可将这些代码编译成库的形式来调⽤,像静态库就是在可执⾏⽂件中包含库代码的⼀份完整拷贝,但这种⽅式有个很严重的缺点就是会造成多份冗余拷贝。静态库会在程序的链接阶段被复制到程序中,所以程序在运⾏后是不会调⽤静态库的。
那动态库⼜是什么呢?
动态库不像静态库那样,在链接阶段并没有被复制到程序中,反⽽是程序运⾏的时候由系统动态的加载到内存中供程序调⽤,所以这⾥解决了静态库早晨多份冗余拷贝的缺点,系统只需要载⼊⼀次动态库,不同的程序可以得到内存中相同的动态库副本,因此可以节省⼤量的内存。
⽣成静态库/动态库
下⾯进⼊主题看看在linux中如何⽣成静态库跟动态库:
⾸先我们先创建三个⽂件,分别为、hello.h、,如下图:
“hello.h":
#ifndef __HELLO_H__
#define __HELLO_H__
#include <stdio.h>
void Hello();
#endif
"":
#include "hello.h"
void Hello()
{
printf("Hello World\n");
}
"":
#include "hello.h"
int main(void)
{
Hello();
return 0;
}
这时我们hello world代码算是写完了。接下来我们⽣成静态库:
g++ -o -static -lhello -L.
我们先简单介绍下"gcc"跟"g++":gcc 最开始的时候是 GNU C Compiler, 如你所知,就是⼀个c编译器。但是后来因为这个项⽬⾥边集成了更多其他不同语⾔的编译器,GCC就代表 the GNU Compiler Collection,所以表⽰⼀堆编译器的合集。 g++则是GCC的c++编译器。
此处我们使⽤g++,如果使⽤c语⾔可以将g++改为gcc:
1、将编译成hello.o(静态库和动态库都是由.o⽂件⽣成)
g++ -
2、为了遵循linux中静态库的命名规范,静态库命名为libhello.a
ar cr libhello.a hello.o
3、将与静态库连接,⽣成可执⾏⽂件:“main”
g++ -o -static -lhello -L.
最后⽂件如下如:
4、运⾏可执⾏⽂件
./main
下⾯进⾏动态库的⽣成:
1、⽣成动态库libhello.so
g++ -c - -o hello.o
g++ -shared hello.o -o libhello.so
当然这⾥我们可以直接通过cmake来⽣成动态库,下⾯我们⽤cmake的⽅式⽣成动态库并链接动态库。
⾸先我们改造下⽬录结构:
我们删除上⼀步⽣成的静态库跟动态库,只保留源代码,在开始的code⽬录下创建两个⽂件夹分别是:build、lib;在code跟lib⽬录下分别创建⼀个⽂件(⽤于编写cmake代码),并在code同级⽬录下创建code2⽬录,在该⽬录下创建build、src⽬录,将之前的移到src下,在code2⽬录跟src⽬录下创建⽂件,先来看看code⽬录下的⽂件,代码如下:
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
lib⽬录下的⽂件代码如下:
cmake如何使用SET(LIBHELLO_)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
INSTALL(TARGETS hello hello
LIBRARY DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)
对上⾯代码解析下,ADD_LIBRARY⽤于⽣成库⽂件,hello是动态库名(libxxx.x中xxx的名字),SHARED表⽰⽣成的库为动态库。之后的INSTALL是安装共享库和头⽂件,安装到系统库中(/usr/lib跟usr/include/hello⽬录下,这⾥的hello⽂件夹是我⾃⼰创建的)。
最后在build⽬录下运⾏终端(在执⾏INSTALL时需要⽤到root权限,所以在执⾏make前先切换到root模式下),输⼊命令⾏如下:
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
make install
可以到指定⽬录中查看库跟头⽂件已经成功安装到了指定⽬录下。
下⾯我们在中调⽤我们⽣成的动态库。
⾸先我们先将中引⼊的头⽂件#include "hello.h"改为#include <hello.h>;
我们先看看code2⽬录下的下的脚本:
PROJECT(NEWHELLO)
ADD_SUBDIRECTORY(src)
src⽬录下的脚本如下:
ADD_EXECUTABLE()
INCLUDE_DIRECTORIES(/usr/include/hello)
TARGET_LINK_LIBRARIES(main libhello.so)
跟上⾯⼀样我们在终端下来到build⽬录,并输⼊命令⾏如下:
cmake ..
make
得到的输出为:Hello World
到这⾥我们链接库的实例就说完了。cmake是个好东西!你值得拥有!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。