下面我来详细讲解一下“CMake 生成静态库与动态库的方法步骤”的完整攻略。
1. 理解静态库与动态库
首先,我们需要理解静态库与动态库的概念。
静态库和动态库都是用于存储二进制代码的文件,其中静态库在编译期间被链接到可执行文件,而动态库则在运行时被动态链接到可执行文件。
在使用CMake构建项目时,可以通过添加不同的参数来指定生成静态库或动态库。
2. 生成静态库
生成静态库需要进行以下步骤:
- 编写代码文件
首先,我们需要编写要放入静态库的代码,在这里我以一个简单的示例程序为例,假设我们需要编写一个计算两个数之和的函数,在头文件add.h中定义如下:
int add(int a, int b);
在源文件add.cpp中实现如下:
#include "add.h"
int add(int a, int b) {
return a + b;
}
- 编写CMakeLists.txt文件
在根目录下新建一个CMakeLists.txt文件,编写如下内容:
cmake_minimum_required(VERSION 3.0)
# 定义项目名称和语言类型
project(MyMathLibrary CXX)
# 添加头文件路径
include_directories(include)
# 添加源文件路径
set(SRC_ADD src/add.cpp)
# 添加静态库
add_library(MathLibrary STATIC ${SRC_ADD})
这里的add_library命令用于生成静态库,${SRC_ADD}即为要编译成静态库的源文件路径。
- 运行CMake生成Makefile文件
在终端中,我们输入以下命令:
$ mkdir build && cd build
$ cmake ..
这里的..指向CMakeLists.txt文件所在的目录。
CMake将会在build目录生成Makefile文件。
- 使用Makefile文件编译
运行以下命令:
$ make
这将会编译生成一个名为libMathLibrary.a的静态库文件,在build目录下。
3. 生成动态库
生成动态库与生成静态库类似,需要进行以下步骤:
- 编写代码文件
继续以计算两个数之和的函数为例,头文件add.h中定义如下:
int add(int a, int b);
在源文件add.cpp中实现如下:
#include "add.h"
__attribute__((visibility("default"))) int add(int a, int b) {
return a + b;
}
其中__attribute__((visibility("default")))是为了保证函数的可见性,在动态库中需要使用该属性。
- 编写CMakeLists.txt文件
在根目录下新建一个CMakeLists.txt文件,编写如下内容:
cmake_minimum_required(VERSION 3.0)
# 定义项目名称和语言类型
project(MyMathLibrary CXX)
# 添加头文件路径
include_directories(include)
# 添加源文件路径
set(SRC_ADD src/add.cpp)
# 添加动态库
add_library(MathLibrary SHARED ${SRC_ADD})
# 设置动态库版本号
set_target_properties(MathLibrary PROPERTIES VERSION 1.0 SOVERSION 1)
这里的add_library命令用于生成动态库,${SRC_ADD}即为要编译成动态库的源文件路径。另外,通过set_target_properties命令可以设置动态库的版本号,方便管理。
- 运行CMake生成Makefile文件
在终端中,我们输入以下命令:
$ mkdir build && cd build
$ cmake ..
这里的..指向CMakeLists.txt文件所在的目录。
CMake将会在build目录生成Makefile文件。
- 使用Makefile文件编译
运行以下命令:
$ make
这将会编译生成一个名为libMathLibrary.so的动态库文件,在build目录下。
4. 示例
下面提供另一个生成动态库的示例,在这个示例中,我们使用CMake构建一个简单的插件程序。
- 编写代码文件
首先,我们需要编写插件的代码,假设我们需要编写一个实现加法的插件,在头文件add.h中定义如下:
int compute(int a, int b);
在源文件add.cpp中实现如下:
#include "add.h"
__attribute__((visibility("default"))) int compute(int a, int b) {
return a + b;
}
- 编写CMakeLists.txt文件
在根目录下新建一个CMakeLists.txt文件,编写如下内容:
cmake_minimum_required(VERSION 3.0)
# 定义项目名称和语言类型
project(MyPlugin CXX)
# 添加头文件路径
include_directories(include)
# 添加插件源文件路径
set(PLUGIN_SRC src/plugin.cpp)
# 添加插件目标文件路径
add_library(my_plugin SHARED ${PLUGIN_SRC})
# 添加目标文件依赖
target_link_libraries(my_plugin MathLibrary)
# 设置插件输出目录
set_target_properties(my_plugin PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/plugins)
# 复制依赖库文件到插件输出目录
add_custom_command(TARGET my_plugin POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:MathLibrary> ${CMAKE_SOURCE_DIR}/plugins)
这里的add_library命令用于生成插件,${PLUGIN_SRC}即为要编译成插件的源文件路径。另外,通过设置LIBRARY_OUTPUT_DIRECTORY,可以指定插件的输出目录。
- 运行CMake生成Makefile文件
在终端中,我们输入以下命令:
$ mkdir build && cd build
$ cmake ..
这里的..指向CMakeLists.txt文件所在的目录。
CMake将会在build目录生成Makefile文件。
- 使用Makefile文件编译
运行以下命令:
$ make
这将会编译生成一个名为libmy_plugin.so的插件文件,在plugins目录下。同时,已经将MathLibrary库文件复制到了plugins目录,以便插件运行时可以正确链接到依赖库。
以上就是CMake 生成静态库与动态库的完整攻略,希望可以帮助到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CMake 生成静态库与动态库的方法步骤 - Python技术站