目录
- 一、背景知识
- 二、使用方法
- (一)编译静态库
- (二)编译动态库
- (三)在主程序中调用库
- 三、总结
一、背景知识
在C/C++开发中,库(Library)是预先编译好的代码集合,可供多个程序使用。根据链接方式不同,库分为静态库和动态库。静态库在编译时将代码直接链接到可执行文件中,可执行文件体积较大,但运行时无需额外库文件;动态库在运行时加载,可执行文件体积小,便于更新和共享,但依赖外部库文件存在。
CMake是一个跨平台的自动化构建工具,通过编写CMakeLists.txt文件来定义项目的构建规则,可以方便地编译静态库、动态库以及主程序,并处理它们之间的依赖关系。
二、使用方法
(一)编译静态库
- 创建项目目录结构
math作为库项目, app作为测试项目
- 编写math目录下的文件
- my_math.cpp
#include "my_math.h"
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
- my_math.h
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
- math/CMakeLists.txt
# 设置这个目录项目的最低版本
cmake_minimum_required(VERSION 3.10)
# 定义一个静态库 math
add_library(math STATIC my_math.cpp)
# 设置头文件公共目录,方便其他模块包含
target_include_directories(math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
- 编写app目录下的文件
- main.c
#include <stdio.h>
#include "../math/my_math.h"
int main() {
int sum = add(1, 2);
int difference = subtract(4, 2);
printf("Sum: %d\n", sum);
printf("Difference: %d\n", difference);
return 0;
}
- app/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 定义一个可执行文件
add_executable(DemoApp main.cpp)
# 链接 math 静态库
target_link_libraries(DemoApp PRIVATE math)
- 编写项目根目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(DemoProject VERSION 1.0)
# 添加 math 目录
add_subdirectory(math)
# 添加 app 目录
add_subdirectory(app)
- 构建项目
在项目根目录下打开终端,执行以下命令:
mkdir build
cd build
cmake ..
cmake --build .
(二)编译动态库
-
创建项目目录结构同静态库部分。
-
修改math目录下的math/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 定义一个动态库 math
add_library(math SHARED my_math.cpp)
# 设置动态库的公共头文件位置
target_include_directories(math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
-
app目录下的文件无需修改。
-
项目根目录下的CMakeLists.txt无需修改。
-
构建项目同静态库部分。
构建完成后,运行生成的DemoApp前,确保动态库对于可执行文件是可见的。在Linux或macOS上,可能需要设置环境变量LD_LIBRARY_PATH或DYLD_LIBRARY_PATH。
(三)在主程序中调用库
在主程序中调用库中的函数,只需包含相应的头文件,并使用函数即可。如上述main.cpp中的代码,通过包含my_math.h头文件,就可以使用add和subtract函数。
三、总结
通过CMake,我们可以方便地编译静态库和动态库,并在主程序中调用。静态库适合代码量不大且需要保证代码安全的场景,动态库适合代码量大且需要共享的场景。在实际项目中,根据需求选择合适的库类型,并合理组织项目结构,可以提高代码的可维护性和可扩展性。