c++动态库和静态库的生成和调用(linux系统)

  • Post author:
  • Post category:linux


简单介绍下linux下c++动态库和静态库的生成和调用。

linux下的静态库是以.a结尾,类似于windows下的.lib文件,动态库以.so结尾,类似于windows下的.dll文件。

动态库文件和静态库文件的优缺点:


.a文件 :静态库文件

,静态库在编译时已经被链接到目标代码中,运行程序不依赖该静态库文件;

优点:将程序使用的函数的机器码复制到最终的可执行文件中,提高了运行速度;如果库函数改变,整个程序需要重新编译

缺点:所有需用到静态库的程序都会被添加静态库的那部分内容,使得可执行代码量相对变多,占用内存和硬盘空间


.so文件:动态库文件

,在程序运行的时候载入动态库文件,程序要正常运行必须依赖于它需要使用的动态库文件;

优点:只有在程序执行的时候, 那些需要使用的函数代码才被拷贝到内存中。动态库在内存中可以被被多个程序使用,又称之为共享库,节约了内存和磁盘空间,以时间效率去换取空间效率;当调用接口没改变,库文件发生改变重新编译,而调用的主程序可不用重新编译;

缺点:运行速度不及静态库文件;

静态库文件的生成:

//hello.h

#ifndef OBJECT_HELLO_H
#define OBJECT_HELLO_H

#include <iostream>

void printHello();
int add(int, int);

#endif //OBJECT_HELLO_H

// hello.cpp
#include "hello.h"

void printHello() {
    std::cout << "hello cpp" << std::endl;
}

int add(int a, int b) {
    return a + b;
}
cmake_minimum_required(VERSION 3.8)
project(object)

set(CMAKE_CXX_STANDARD 14)

include_directories(include)
add_library(hello include/hello.h src/hello.cpp)

然后 mkdir build && cd build && cmake … && make

即可生成.a的静态库文件:

在这里插入图片描述

静态库文件的调用:

目录结构:

在这里插入图片描述

//test.cpp
#include "include/hello.h"

int main() {

    printHello();
    std::cout << "3 + 5 = " << add(3, 5) << std::endl;
    return 0;
}

cmake_minimum_required(VERSION 3.8)
project(object)

set(CMAKE_CXX_STANDARD 14)

#include_directories(include)
#add_library(hello include/hello.h src/hello.cpp)


link_directories(build)
add_executable(test test.cpp)
target_link_libraries(test libhello.a)

编译,运行,结果如下:

在这里插入图片描述

动态库的生成和调用和静态库类似,这里不做过多的解释。主要的区别就是CMakeLists.txt文件的编写有些许不一样,还是这个例子,CMakeLists.txt内容如下(add_library 后面加了一个SHARED关键字):

cmake_minimum_required(VERSION 3.8)
project(object)

set(CMAKE_CXX_STANDARD 14)

include_directories(include)
add_library(hello  SHARED  include/hello.h src/hello.cpp)

.so调用方式和.a调用方式类似,唯一需要注意的是.so文件需要有相应的依赖才可以运行。假如一台电脑生成的.so文件想要在另外一台电脑上面运行,那么另外一天电脑必须安装有相应的依赖。查看.so文件的依赖,可以使用一下命令: ldd XXX.so

.a静态库文件不需要安装相应的依赖,拷贝到另外一台电脑可以直接调用。



版权声明:本文为hongge_smile原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。