★,°:.☆( ̄▽ ̄)/$:.°★
这篇文章主要介绍C++创建动态链接库并调用。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路
C++动态库是一种常用的库文件形式。它允许多个应用程序共享代码和数据,提供了一种有效地组织、重用和管理代码的方式。
与静态库不同,动态库在运行时被加载到内存中,并通过链接器动态地连接到应用程序。这意味着多个应用程序可以同时使用同一个动态库,从而减少了内存占用和可执行文件的大小。
C++动态库具有以下优势:
1.代码共享:多个应用程序可以共享同一个动态库中的代码和函数。这使得开发者可以将通用的功能封装到一个库中,以便在多个项目中重复使用,从而提高代码的复用性和维护性。
2.动态加载:动态库在运行时动态加载到内存中,而不是在编译时静态链接到应用程序。这使得应用程序能够根据需要加载不同版本或替代实现的库,从而实现更灵活的软件设计和更新。
3.更新和修复:由于动态库是独立于应用程序的,所以可以单独更新和修复库文件,而无需重新编译整个应用程序。这样可以加快更新和发布新功能的速度,同时减少对已部署应用程序的影响。
4.内存效率:由于多个应用程序可以共享同一个动态库的实例,因此可以减少内存占用。这在需要同时加载多个应用程序时尤为重要。
创建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
创建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!
以上。