C++ 静态库、动态库使用Cmake构建系统
源代码
案例1:无静态库、动态库参与
文件目录结构1
假设include目录存放头文件data.h包含函数声明,src目录存放对应的data.cpp文件包含函数定义、以及一个全局变量。main.cpp存放在文件根目录、包含main函数入口。
代码内容
常规编译指令
g++ main.cpp src/data.cpp -Iinclude -o main
Cmake构建
新建CMakeList.txt文件,填写以下4行内容:
cmake_minimum_required(VERSION 3.5)
project (hello_cmake1)
include_directories(include/) # 与g++ 命令的 -Iinclude 参数等价
add_executable(main main.cpp src/data.cpp) # g++ main.cpp src/data.cpp -o main
效果:
案例2:静态链接库参与
原来三个文件的代码不变。
首先看常规的基于g++ 编译生成静态链接库的命令:
cd src
g++ data.cpp -c -I../include # 汇编,生成data.o文件
ar rs libdata.a data.o # 生成静态库 libdata.a
cd ..
g++ main.cpp -Iinclude -Lsrc -ldata -o static_main # 链接,生成可执行文件static_main
Cmake构建
新建CMakeList.txt文件,填写以下内容:
cmake_minimum_required(VERSION 3.5)
project (hello_cmake2)
# 生成静态链接库
add_library(Data STATIC src/data.cpp)
target_include_directories(Data PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 生成可执行文件
add_executable(static_main main.cpp)
# 链接静态/共享 库文件
target_link_libraries(static_main PUBLIC Data)
效果:
案例3:动态链接库参与
原来三个文件的代码不变。
首先看常规的基于g++ 编译生成动态链接库的命令:
cd src
g++ data.cpp -I../include -fPIC -shared -o libdata.so
# 上一条等价于下面两条:
# g ++ data.cpp -I../include -c -fPIC 汇编,生成data.o文件
# g++ -shared -o libdata.so data.o 生成动态库 libdata.so
cd ..
g++ main.cpp -Iinclude -Lsrc -ldata -o share_main # 链接,生成可执行文件static_main
Cmake构建
cmake_minimum_required(VERSION 3.5)
project (hello_cmake3)
# 生成动态链接库
add_library(Data2 SHARED src/data.cpp)
target_include_directories(Data2 PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 添加编译参数
add_compile_options(-w -std=c++11 -O2)
# 生成可执行文件
add_executable(share_main main.cpp)
# 链接静态/共享 库文件
target_link_libraries(share_main PUBLIC Data2)
效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!