【C++】C++创建动态链接库并调用

★,°:.☆( ̄▽ ̄)/$:.°★
这篇文章主要介绍C++创建动态链接库并调用。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路

文章目录

    • :smirk:1. c++库介绍
    • :blush:2. c++创建动态链接库
    • :satisfied:3. c++调用动态链接库

1. c++库介绍

C++动态库是一种常用的库文件形式。它允许多个应用程序共享代码和数据,提供了一种有效地组织、重用和管理代码的方式。

与静态库不同,动态库在运行时被加载到内存中,并通过链接器动态地连接到应用程序。这意味着多个应用程序可以同时使用同一个动态库,从而减少了内存占用和可执行文件的大小。

C++动态库具有以下优势:

1.代码共享:多个应用程序可以共享同一个动态库中的代码和函数。这使得开发者可以将通用的功能封装到一个库中,以便在多个项目中重复使用,从而提高代码的复用性和维护性。

2.动态加载:动态库在运行时动态加载到内存中,而不是在编译时静态链接到应用程序。这使得应用程序能够根据需要加载不同版本或替代实现的库,从而实现更灵活的软件设计和更新。

3.更新和修复:由于动态库是独立于应用程序的,所以可以单独更新和修复库文件,而无需重新编译整个应用程序。这样可以加快更新和发布新功能的速度,同时减少对已部署应用程序的影响。

4.内存效率:由于多个应用程序可以共享同一个动态库的实例,因此可以减少内存占用。这在需要同时加载多个应用程序时尤为重要。

2. c++创建动态链接库

创建create_so文件夹,结构如下:

.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── lib
│   └── lib_hello
└── lib_hello
    ├── CMakeLists.txt
    ├── hello.cpp
    └── hello.h

CMakeLists.txt如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Create_so)
# 若变量BUILD_SHARED_LIBS没有设置,并且在ADD_LIBRARY时没有指定库类型
# 默认生成的都是静态库
#SET(BUILD_SHARED_LIBS on)
ADD_SUBDIRECTORY(lib_hello)

创建lib_hello目录,CMakeLists.txt如下:

AUX_SOURCE_DIRECTORY(. SRC_LIST)
ADD_LIBRARY(hello_shared SHARED ${SRC_LIST}) # lib的名字不能重复
ADD_LIBRARY(hello_static STATIC ${SRC_LIST})
# 希望 "hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下:
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")
# 设置动态库的版本号
SET_TARGET_PROPERTIES(hello_shared PROPERTIES VERSION 1.2 SOVERSION 1)
# 指定保存路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

hello.h如下:

#ifndef HELLO_H
#define HELLO_H
void Hello(void);
int Sum(int a, int b);
#endif

hello.cpp如下:

#include 
#include "hello.h"
using namespace std;
void Hello(void)
{
    cout << "hello world" << endl;
}

int Sum(int a, int b)
{
    int c;
    c = a + b;
    return c; 
}

编译:

mkdir build && cd build
cmake ..
# 生成so文件在build/lib下的libhello.so

3. c++调用动态链接库

创建use_so目录,结构如下:

.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── bin
│   ├── cmake_install.cmake
│   └── src
└── src
    ├── CMakeLists.txt
    └── main.cpp

CMakeLists.txt如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Use_so)
ADD_SUBDIRECTORY(src)

创建src,CMakeLists.txt如下:

AUX_SOURCE_DIRECTORY(. SRC_LIST)
LINK_DIRECTORIES(/home/dev/test/create_so/build/lib) # 这行一定要在ADD_EXECUTABLE前面
ADD_EXECUTABLE(use_so ${SRC_LIST})
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

SET(CMAKE_PROJECT_DIR /home/dev/test) # 文件夹的位置
INCLUDE_DIRECTORIES(${CMAKE_PROJECT_DIR}/create_so/lib_hello)
TARGET_LINK_LIBRARIES(use_so hello) # 链接动态库
#TARGET_LINK_LIBRARIES(use_so libhello.a) # 链接静态库

main.cpp如下:

#include 
#include 
int main(int argc, char **argv)
{
    std::cout << "Example: use c++ .so lib" << std::endl;
    Hello();
    int c = Sum(1, 2);
    std::cout << "c: " << c << std::endl;
    std::cout << "End!" << std::endl;
    return 0;
}

调用后结果如下:

Example: use c++ .so lib
hello world
c: 3
End!

在这里插入图片描述

以上。

你可能感兴趣的:(c++基础与应用,c++,开发语言,动态库)