C++ Cmake的构建静态库和动态库详解
什么是静态库和动态库
在C++编程中,常常需要使用一些共用的代码库,这些代码库可以被其他的程序或者模块共享使用。为了方便管理这些代码库,我们通常会将它们打包成静态库或者动态库。静态库是在编译时被链接到程序中,而动态库则是在运行时被链接到程序中。两者的主要区别在于,静态库会被完全复制到编译后的可执行文件中,而动态库则只会在程序启动时加载并链接。
Cmake构建静态库
在Cmake中,我们可以使用add_library
命令来构建静态库。该命令的语法如下:
add_library(libname STATIC source1 source2 ...)
其中,libname
是库的名称,source1
、source2
等则是源文件的列表。下面是一个简单的示例:
├── CMakeLists.txt
└── srcs
├── func1.cpp
├── func2.cpp
└── func3.cpp
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(mylib)
add_library(mylib STATIC srcs/func1.cpp srcs/func2.cpp srcs/func3.cpp)
在编译时,我们可以使用以下指令:
mkdir build
cd build
cmake ..
make
编译完成后,会在build
目录下生成一个名为libmylib.a
的静态库。
Cmake构建动态库
与构建静态库类似,在Cmake中,我们可以使用add_library
命令来构建动态库。不过要将STATIC
关键字改为SHARED
。下面是一个简单的示例:
├── CMakeLists.txt
└── srcs
├── func1.cpp
├── func2.cpp
└── func3.cpp
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(mylib)
add_library(mylib SHARED srcs/func1.cpp srcs/func2.cpp srcs/func3.cpp)
在编译时,我们可以使用以下指令:
mkdir build
cd build
cmake ..
make
编译完成后,会在build
目录下生成一个名为libmylib.so
的动态库。
示例1:静态库和动态库交叉编译
在开发中,有时我们需要将代码库在不同平台之间进行移植。这时候就需要进行交叉编译。下面是一个简单的示例。
假设我们需要将上述示例在arm64平台上进行编译。首先,我们需要安装aarch64-linux-gnu-g++
编译器。我们可以使用以下指令进行安装:
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
然后,我们需要修改CMakeLists.txt
文件,以支持交叉编译:
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(mylib)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
add_library(mylib STATIC srcs/func1.cpp srcs/func2.cpp srcs/func3.cpp)
接下来,我们需要创建一个编译目录,然后运行cmake
命令来配置项目:
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
其中,toolchain.cmake
是一个交叉编译的工具链文件,其内容如下:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
最后,我们可以使用以下指令进行编译:
make
编译完成后,会在build
目录下生成一个名为libmylib.a
的静态库(或者名为libmylib.so
的动态库,根据项目配置而定)。
示例2:为动态库定制名称和版本号
在实际开发中,我们常常需要为动态库定制名称和版本号。这可以通过SET_TARGET_PROPERTIES
命令来实现。下面是一个简单的示例。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(mylib)
add_library(mylib SHARED srcs/func1.cpp srcs/func2.cpp srcs/func3.cpp)
# 指定库的名称和版本号
set_target_properties(mylib PROPERTIES
VERSION 1.0.0
SOVERSION 1
OUTPUT_NAME "mylib-custom-name")
其中,VERSION
用于指定库的版本号,SOVERSION
用于指定API的版本号,OUTPUT_NAME
用于指定库文件的名称。
在编译时,我们可以使用以下指令:
mkdir build
cd build
cmake ..
make
编译完成后,会在build
目录下生成一个名为mylib-custom-name.so
的动态库。
总结
本文介绍了如何使用Cmake构建静态库和动态库,并提供了两个示例。静态库适用于需要在编译时被链接到程序中的场景,动态库适用于需要在运行时被动态加载和链接的场景。在实际开发中,我们可以通过交叉编译和定制名称和版本号来实现库的移植和管理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ Cmake的构建静态库和动态库详解 - Python技术站