当前位置:网站首页>补充番外14:cmake实践项目笔记(未完待续4/22)
补充番外14:cmake实践项目笔记(未完待续4/22)
2022-04-23 04:31:00 【谢白羽】
文章目录
一、安装cmake
1)卸载旧版本cmake
apt-get autoremove cmake
2)文件下载解压:
https://cmake.org/files/v3.9/cmake-3.9.1-Linux-x86_64.tar.gz
tar zxvf cmake-3.9.1-Linux-x86_64.tar.gz
3)查看目录
tree -L 2 cmake-3.9.1-Linux-x86_64
2 cmake-3.9.1-Linux-x86_64
3 ├── bin
4 │ ├── ccmake
5 │ ├── cmake
6 │ ├── cmake-gui
7 │ ├── cpack
8 │ └── ctest
9 ├── doc
10 │ └── cmake
11 ├── man
12 │ ├── man1
13 │ └── man7
14 └── share
15 ├── aclocal
16 ├── applications
17 ├── cmake-3.9
18 ├── icons
19 └── mime
20 12 directories, 5 files
4)创建软链接
注: 文件路径是可以指定的, 一般选择在 /opt 或 /usr 路径下, 这里选择 /opt
1 mv cmake-3.9.1-Linux-x86_64 /opt/cmake-3.9.1
2 ln -sf /opt/cmake-3.9.1/bin/* /usr/bin/
二、项目
1)单个文件目录实现
(1)基本工程
1 # 单个目录实现
2 # CMake 最低版本号要求
3 cmake_minimum_required (VERSION 2.8)
#指定工程名字,和二进制名字是可以不一样的,可以生成多个执行文件
PROJECT(0VOICE)
4 # 手动加填加文件
5 SET(SRC_LIST main.c)
SET(SRC_LIST2 main2.c)
6 MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
7 MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
8 ADD_EXECUTABLE(0voice ${SRC_LIST}) //执行文件叫0voice
ADD_EXECUTABLE(0voice2 ${SRC_LIST2})
(2)目录展现
cmakeLists.txt与main.c在同一目录
(3)代码
main.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("0voice2 CMake!!!\n");
return 0;
}
main2.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("0voice CMake!!!\n");
return 0;
}
(4)指令
cmake . //.的位置表示的是cmakelists.txt的位置,配置好
make //编译
./执行文件 //执行
2)改进工程结构
(1)基本工程
- 指定安装目录
cmake -DCMAKE_INSTALL_PREFIX=/tmp/usr … (默认是安装到/usr/loacl/)
- 主目录cmake
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)
# 添加子目录
ADD_SUBDIRECTORY(src)
#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
# 安装doc到 share/doc/cmake/0voice目录
# 默认/usr/local/
#指定自定义目录,比如 cmake -DCMAKE_INSTALL_PREFIX=/tmp/usr ..
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)
- src目录的cmake
# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
# PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
ADD_EXECUTABLE(youzi ${SRC_LIST})
# 将执行文件安装到bin目录
# 默认/usr/local/
#指定自定义目录,比如 cmake -DCMAKE_INSTALL_PREFIX=/tmp/usr ..
INSTALL(TARGETS youzi RUNTIME DESTINATION bin)
(2)目录展现
1 .
2 ├── build
3 ├── CMakeLists.txt
4 ├── doc
5 │ ├── darren.txt
6 │ └── README.MD
7 └── src
8 ├── CMakeLists.txt
9 └── main.c
(3)代码
main.c
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("0voice CMake!!!\n");
return 0;
}
(4)指令
cmake -DCMAKE_INSTALL_PREFIX=/tmp/usr ..
make install
cd xxx
./执行文件
3)多个目录实践编译(库文件生成调用法)
(1)基本工程
(2)目录展现
- 子目录编译成库文件
1 ├── CMakeLists.txt
2 ├── doc
3 │ ├── darren.txt
4 │ └── README.MD
5 └── src
6 ├── CMakeLists.txt
7 ├── dir1
8 │ ├── CMakeLists.txt
9 │ ├── dir1.c
10 │ └── dir1.h
11 ├── dir2
12 │ ├── CMakeLists.txt
13 │ ├── dir2.c
14 │ └── dir2.h
15 └── main.c
(3)代码
- 最外cmake
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)
# 添加子目录
ADD_SUBDIRECTORY(src bin)
#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)
- src的cmake
# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
# 添加头文件路径
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
INCLUDE_DIRECTORIES(dir1) #这两种写法都可以
MESSAGE(STATUS "CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR})
# 添加 dir1 子目录
ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/dir1")
# 添加头文件路径
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
# 添加 dir2 子目录
ADD_SUBDIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
#定义了这个工程会生成一个文件名为[BINARY]可执行文件,相关的源文件是 SOURCE_LIST 中
定义的源文件列表
ADD_EXECUTABLE(darren ${SRC_LIST} )
#链接库到执行文件上
TARGET_LINK_LIBRARIES(darren dir1 dir2)
# 将执行文件安装到bin目录
INSTALL(TARGETS darren RUNTIME DESTINATION bin)
- 子目录的cmake
# 加载所有的源码,和makefile wildcard类似,想当于SET (DIR_SRCS dir1.c)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
# SET(DIR_SRCS dir1.c dir12.c)
# 默认是静态库,SHARED是生成动态库
ADD_LIBRARY (dir1 SHARED ${DIR_SRCS})
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_LIBRARY (dir2 ${DIR_SRCS})
(4)指令
mkdir build
cd build
cmake ..
make
4)多个目录实践编译(遍历源文件并加载)
(1)基本工程
- 主目录cmake
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(0VOICE)
ADD_SUBDIRECTORY(src bin)
MESSAGE(STATUS "TOP CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR})
#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)
- src的cmake
# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
# PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
#设置子目录
set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2")
foreach(SUB_DIR ${SUB_DIR_LIST})
#遍历源文件
aux_source_directory(${SUB_DIR} SRC_LIST)
MESSAGE(STATUS "SUB_DIR-> " ${SUB_DIR})
MESSAGE(STATUS "SRC_LIST-> " ${SRC_LIST})
endforeach()
# 添加头文件路径
INCLUDE_DIRECTORIES("dir1")
INCLUDE_DIRECTORIES("dir2")
(2)目录展现
1 .
2 ├── CMakeLists.txt
3 ├── doc
4 │ ├── darren.txt
5 │ └── README.MD
6 └── src
7 ├── CMakeLists.txt
8 ├── dir1
9 │ ├── dir1.c
10 │ └── dir1.h
11 ├── dir2
12 │ ├── dir2.c
13 │ └── dir2.h
14 └── main.c
(3)代码
(4)指令
mkdir build
cd build
cmake ..
make
5)生成动态库
(1)基本工程
# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
MESSAGE(STATUS "Release版本")
SET(BuildType "Release")
else()
SET(BuildType "Debug")
MESSAGE(STATUS "Debug版本")
endif()
#设置lib库目录
#PROJECT_SOURCE_DIR 跟着最近工程的目录
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
# debug和release版本目录不一样
#设置生成的so动态库最后输出的路径
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
ADD_COMPILE_OPTIONS(-fPIC)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
# 生成静态库链接库Dir1
#ADD_LIBRARY (Dir1 ${DIR_LIB_SRCS})
# 生成动态库
ADD_LIBRARY (Dir1 SHARED ${DIR_LIB_SRCS})
(2)目录展现
(3)代码
(4)指令
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug .. (编译debug版本,编译release版本就=Release)
make
- 说明:
debug版本会使用参数-g;
release版本会使用-O3 -DNDEBUG
6)生成静态库+安装到指定目录
(1)基本工程
# 设置release版本还是debug版本
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
MESSAGE(STATUS "Release版本")
SET(BuildType "Release")
else()
SET(BuildType "Debug")
MESSAGE(STATUS "Debug版本")
endif()
#设置lib库目录
SET(RELEASE_DIR ${PROJECT_SOURCE_DIR}/release)
# debug和release版本目录不一样
#设置生成的so动态库最后输出的路径
SET(LIBRARY_OUTPUT_PATH ${RELEASE_DIR}/linux/${BuildType})
ADD_COMPILE_OPTIONS(-fPIC)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
# 生成静态库链接库Dir1
ADD_LIBRARY (Dir1 ${DIR_LIB_SRCS})
# 将库文件安装到lib目录
INSTALL(TARGETS Dir1 DESTINATION lib)
# 将头文件include
INSTALL(FILES dir1.h DESTINATION include)
#INSTALL(FILES *.h DESTINATION include)
(2)目录展现
(3)代码
(4)指令
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/tmp/usr ..
make
make install
make clean
7)调用静态库
(1)基本工程
# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
#包头文件
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib")
#指定库的路径
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib")
# 引用动态库
ADD_EXECUTABLE(darren ${SRC_LIST})
#链接库文件
TARGET_LINK_LIBRARIES(darren Dir1)
(2)目录展现
(3)代码
(4)指令
8)调用动态库
(1)基本工程
# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib")
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib")
# 引用动态库
ADD_EXECUTABLE(darren ${SRC_LIST})
# 优先连接动态库
#TARGET_LINK_LIBRARIES(darren Dir1)
# 强制使用静态库 完整的库文件名libDir1.a
TARGET_LINK_LIBRARIES(darren libDir1.a)
(2)目录展现(默认优先链接动态库,ldd daren去看)
(3)代码
(4)指令
9)编译debug版本release版本
(1)基本工程
(2)目录展现
1 .
2 ├── CMakeLists.txt
3 ├── doc
4 │ ├── darren.txt
5 │ └── README.md
6 ├── release
7 │ └── linux
8 │ ├── Debug
9 │ └── Release
10 └── src
11 ├── CMakeLists.txt
12 ├── dir1
13 │ ├── CMakeLists.txt
14 │ ├── dir1.c
15 │ └── dir1.h
16 ├── dir2
17 │ ├── CMakeLists.txt
18 │ ├── dir2.c
19 │ └── dir2.h
20 ├── main.c
21 ├── Makefile
22 ├── README.md
23 └── release
24 └── linux
(3)代码
(4)指令
编译debug版本
cmake -DCMAKE_INSTALL_PREFIX=/tmp/usr ..
make install
//
编译release版本
cmake -DCMAKE_BUILD_TYPE=Release ..
10)
(1)基本工程
(2)目录展现
(3)代码
(4)指令
01 55 36
版权声明
本文为[谢白羽]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43679037/article/details/124311602
边栏推荐
- [echart] Introduction to echart
- 【BIM+GIS】ArcGIS Pro2.8如何打开Revit模型,BIM和GIS融合?
- 重剑无锋,大巧不工
- 阿里云IoT流转到postgresql数据库方案
- 补:注解(Annotation)
- Network principle | connection management mechanism in TCP / IP important protocol and core mechanism
- Unipolar NRZ code, bipolar NRZ code, 2ASK, 2FSK, 2PSK, 2DPSK and MATLAB simulation
- 兼容NSR20F30NXT5G的小体积肖特基二极管
- Microbial neuroimmune axis -- the hope of prevention and treatment of cardiovascular diseases
- The latest price trend chart and trading points of London Silver
猜你喜欢
阿里云IoT流转到postgresql数据库方案
上海航芯技术分享 | ACM32 MCU安全特性概述
Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.1.15.
递归调用--排列的穷举
zynq平台交叉编译器的安装
Iron and intestinal flora
【论文阅读】【3d目标检测】Voxel Transformer for 3D Object Detection
Bacterial infection and antibiotic use
那些年我面试过的Android开发岗总结(附面试题+答案解析)
How to regulate intestinal flora? Introduction to common natural substances, probiotics and prebiotics
随机推荐
Set classic topics
减治思想——二分查找详细总结
兼容NSR20F30NXT5G的小体积肖特基二极管
AWS EKS 部署要点以及控制台与eksctl创建的差异
【论文阅读】【3d目标检测】Improving 3D Object Detection with Channel-wise Transformer
【NeurIPS 2019】Self-Supervised Deep Learning on Point Clouds by Reconstructing Space
Apache Bench(ab 压力测试工具)的安装与使用
Operating skills of spot gold_ Wave estimation curve
补:注解(Annotation)
Thought of reducing Governance -- detailed summary of binary search
Bridge between ischemic stroke and intestinal flora: short chain fatty acids
thymeleaf th:value 为null时报错问题
KVM error: Failed to connect socket to ‘/var/run/libvirt/libvirt-sock‘
RuntimeError: output with shape [4, 1, 512, 512] doesn‘t match the broadcast shape[4, 4, 512, 512]
Microbial neuroimmune axis -- the hope of prevention and treatment of cardiovascular diseases
【测绘程序设计】坐标方位角推算神器(C#版)
指纹Key全国产化电子元件推荐方案
Single chip microcomputer serial port data processing (1) -- serial port interrupt sending data
Common string processing functions in C language
基于英飞凌MCU GTM模块的无刷电机驱动方案开源啦