C++基础-------CMake静态库和动态库链接

C++的编译过程

使用g++等编译工具,从源码生成最终的可执行文件一般有这几步:预处理(Preprocess)、编译(Compile)、汇编(assemble)、链接(link)

生成静态库并链接

附件位置:4.static_lib_test

A.生成静态库链接
cpp 复制代码
#account_dir/CMakeLists.txt
# 最低版本要求

cmake_minimum_required(VERSION 3.10)


# 项目信息

project(Account)


# 添加静态库,Linux下会生成libAccount.a

add_library(Account STATIC Account.cpp Account.h)

进行编译

cpp 复制代码
cmake -S . -B build
cmake --build build/

进入account_dir进行编译,创建爱连接库:libAccount.a文件

复制代码
# 编译静态库后,会在build下生成 build/libAccount.a 静态库文件

account_dir/

├── Account.cpp

├── Account.h

├── build

│   └── libAccount.a

└── CMakeLists.txt

这里我们用到add_library, 和add_executable一样,Account为最终生成的库文件名(lib库名称.a),第二个参数是用于指定链接库为动态链接库(SHARED)还是静态链接库(STATIC),后面的参数是需要用到的源文件。

B.生成静态库链接
cpp 复制代码
# test_account/CMakeLists.txt
# 最低版本要求

cmake_minimum_required(VERSION 3.10)


# 项目名称

project(test_account)


# 添加执行文件

add_executable(test_account test_account.cpp)



# 添加头文件目录,如果不添加,找不到头文件

target_include_directories(test_account PUBLIC "../account_dir")

# 添加库文件目录,如果不添加,找不到库文件

target_link_directories(test_account PUBLIC "../account_dir/build")

# 添加目标链接库

target_link_libraries(test_account PRIVATE Account)
cpp 复制代码
cmake -S . -B build
cmake --build build/
复制代码
# 编译后目录如下

4.static_lib_test/

├── account_dir

│   ├── Account.cpp

│   ├── Account.h

│   ├── build

│   │   └── libAccount.a

│   └── CMakeLists.txt

└── test_account 

    ├── build

    │   └── test_account

    ├── CMakeLists.txt

    └── test_account.cpp

我们通过add_library和add_executable定义了Target,我们可以通过Target的名称为其添加属性,例如:

cpp 复制代码
# 指定目标包含的头文件目录

target_include_directories(test_account PUBLIC "../account_dir")

# 添加库文件目录,如果不添加,找不到库文件

target_link_directories(test_account PUBLIC "../account_dir/build")

# 指定目标链接的库

target_link_libraries(test_account PRIVATE Account)

通过target_include_directories,我们给test_account添加了头文件引用路径".../account_dir"。上面的关键词PUBLIC,PRIVATE用于说明目标属性的作用范围,更多介绍参考下节。

通过target_link_libraries,将前面生成的静态库libAccount.a链接给对象test_account,但此时还没指定库文件的目录,CMake无法定位库文件

再通过target_link_directories,添加库文件的目录即可。

生成动态库并连接:SHARED

A.生成动态库链接,生成libAccount.so
cpp 复制代码
#account_dir/CMakeLists.txt


# 添加动态库,Linux下会生成libAccount.so

add_library(Account SHARED Account.cpp Account.h)

进行编译

cpp 复制代码
cmake -S . -B build
cmake --build build/

编译动态库后,会在build下生成 build/libAccount.so 动态库文件

复制代码
account_dir/

├── Account.cpp

├── Account.h

├── build

│   └── libAccount.so

└── CMakeLists.txt
B.生成动态库链接

操作不变。

cpp 复制代码
# ldd查看依赖的动态库
libAccount.so => /home/enpei/Documents/course_cpp_tensorrt/course_5/src/5.dynamic_lib_test/test_account/../account_dir/build/libAccount.so (0x00007fb692cf1000)

当然,也可以用一个CMakeLists.txt来一次性编译,参考附件6.build_together

cpp 复制代码
#build_together/CMakeLists.txt`
# 最低版本要求

cmake_minimum_required(VERSION 3.10)


# 项目信息

project(test_account)


# 添加动态库

add_library(Account SHARED "./account_dir/Account.cpp" "./account_dir/Account.h")


# 添加可执行文件

add_executable(test_account "./test_account/test_account.cpp")


# 添加头文件

target_include_directories(test_account PUBLIC "./account_dir")

# 添加链接库

target_link_libraries(test_account Account)

进行编译

cpp 复制代码
cmake -S . -B build
cmake --build build/
测试
cpp 复制代码
./build/test_account
相关推荐
索西引擎10 小时前
【React】JSX:JavaScript 语法扩展的本质、编译机制与表达能力分析
前端·javascript·react.js
国科安芯17 小时前
航天电子模拟前端三大支柱:精密运放、高速运放与电压监控的协同设计方法——ASL8522S/ASL622S/ASL706S技术解析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试
神明不懂浪漫18 小时前
【第四章】CSS(二)——文本外观属性与复合选择器
前端·css·经验分享·笔记
kyriewen18 小时前
别再用AI debug了——这5种bug越修越烂
前端·javascript·ai编程
星释19 小时前
鸿蒙智能体开发实战:39.鸿蒙壁纸大师 - 前端卡片显示与交互优化
前端·华为·交互·harmonyos·鸿蒙·火山引擎
顾昂_20 小时前
内存泄漏排查和 Chrome DevTools 使用教程
前端·javascript·面试
IT_陈寒21 小时前
Java线程池这个坑我算是踩明白了
前端·人工智能·后端
从零开始的代码生活_21 小时前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端
315356691321 小时前
Superpowers:GPT-5.6 时代下的流程毒瘤
前端·后端
清秋1 天前
全网最全 ECMAScript 攻略( 更新至 ES2026)
前端·javascript·编程语言