当前位置:网站首页>补充番外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
边栏推荐
- 第四章 --- 了解标准设备文件、过滤器和管道
- MATLAB lit plusieurs diagrammes fig et les combine en un seul diagramme (sous forme de sous - Diagramme)
- C language character constant
- 【NeurIPS 2019】Self-Supervised Deep Learning on Point Clouds by Reconstructing Space
- Chlamydia infection -- causes, symptoms, treatment and Prevention
- [AI vision · quick review of NLP natural language processing papers today, issue 31] Fri, 15 APR 2022
- Mysql---数据读写分离、多实例
- 指纹Key全国产化电子元件推荐方案
- shell wc (统计字符数量)的基本使用
- Introduction to Cortex-M3 register set, assembly language and C language interface
猜你喜欢

【论文阅读】【3d目标检测】Improving 3D Object Detection with Channel-wise Transformer

A function second kill 2sum 3sum 4sum problem

QtSpim手册-中文翻译

MYSQL50道基础练习题

【论文阅读】【3d目标检测】Voxel Transformer for 3D Object Detection

针对NFT的网络钓鱼

Brushless motor drive scheme based on Infineon MCU GTM module

【BIM+GIS】ArcGIS Pro2. 8 how to open Revit model, Bim and GIS integration?

Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.1.15.

Cause analysis of incorrect time of AI traffic statistics of Dahua Equipment Development Bank
随机推荐
C语言 字符常量
IEEE Transactions on Systems, Man, and Cybernetics: Systems(TSMC)投稿须知
matlab读取多张fig图然后合并为一张图(子图的形式)
Interaction of diet gut microbiota on cardiovascular disease
The difference between lists, tuples, dictionaries and collections
智能电子秤全国产化电子元件推荐方案
Basic introduction to spot gold
【Echart】echart 入门
【BIM+GIS】ArcGIS Pro2.8如何打开Revit模型,BIM和GIS融合?
那些年我面试过的Android开发岗总结(附面试题+答案解析)
Fusobacterium -- symbiotic bacteria, opportunistic bacteria, oncobacterium
Network principle | connection management mechanism in TCP / IP important protocol and core mechanism
单极性非归零NRZ码、双极性非归零NRZ码、2ASK、2FSK、2PSK、2DPSK及MATLAB仿真
RuntimeError: output with shape [4, 1, 512, 512] doesn‘t match the broadcast shape[4, 4, 512, 512]
Xshell、Xftp连接新创建的Unbutu系统虚拟机全流程
eksctl 部署AWS EKS
IDE Idea 自动编译 与 On Upate Action 、 On Frame Deactivation 的配置
[BIM introduction practice] wall hierarchy and FAQ in Revit
Introduction to Cortex-M3 register set, assembly language and C language interface
单片机串口数据处理(2)——uCOSIII+循环队列接收数据