IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Liunx下的Cmake编译C/C++程序方法精要 -> 正文阅读

[C++知识库]Liunx下的Cmake编译C/C++程序方法精要

前言

????????我们在很多第三方库中都能够看到CMakeLists.txt的身影。这就是我们熟悉的Cmake编译方法所需要的文件。本篇博客就来讲解一下此文件大致需要如何撰写和使用。如果后续有需要,会再写个《详解》。

????????本例程是笔者项目中所用的内容,所以运行环境是Jetson Nano Ubuntu 20.04。


CMakeLists.txt文件内容结构及其写法

①说明本项目最低cmake配置要求

cmake_minimum_required(VERSION 3.0.0)

②说明本项目名称和版本信息

project(CmakeTestProject VERSION 0.1.0)

这里,这个项目名就是CmakeTestProject。版本号为0.1.0

③配置编译标准,例如C++标准,C标准,编译模式debug还是release,等等。

# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++0x")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -g2 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

举个例子,就是这样。例如第四排表示 用C++11标准,第五排表示用debug模式。

关于set()这个指令方法内容量是比较大的,能实现很多功能的设置,例如,设置项目生成可执行文件的路径。这在此处就不做详解了,其他博文也有挺多,不过好像讲得不是那么通俗易懂。

set还可以用做变量定义,例如,我要将 根目录下的gen 路径定义为GEN_DEST变量名

set(GEN_DEST ${CMAKE_CURRENT_SOURCE_DIR}/gen/)

此处这个${CMAKE_CURRENT_SOURCE_DIR}表示项目的根目录。就是CmakeList.txt存放的这一级目录。

④项目中所用到的库文件引用。这部分只会涉及.c和.cpp文件

file(GLOB_RECURSE 自定义变量名 路径)

例如:

file(GLOB_RECURSE ca_gen_srcs_cpp ${GEN_DEST}/src/*.cpp)
file(GLOB_RECURSE ca_gen_srcs_c ${GEN_DEST}/src/*.c)
file(GLOB_RECURSE usr_srcs_cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

这里就是讲后面路径下的所有.cpp或.c文件包含进前面这个变量里。

⑤引用头文件。这部分就只涉及.h和.hpp文件

include_directories(路径)

?例如:

include_directories(${GEN_DEST}/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

这里就可以不用具体指定文件了。

⑥为了方便阅读,集合一下前面所用的file内容。就是set一下

set(ALL_COMPILE_SRC
    ${ca_gen_srcs_cpp}
    ${ca_gen_srcs_c}
    ${usr_srcs_cpp}
)

把第④步骤的内容集合一下,合为一个变量叫ALL_COMPILE_SRC(也可以用其他变量名)。

⑦链接动态库,如果没有需要引用的动态库,此步骤可以省略,不过笔者项目需要:

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)

也就是

link_directories(路径)

?⑧将源代码添加到此项目的可执行文件

add_executable (server1 "server.cpp" ${ALL_COMPILE_SRC})

也就是

?add_executable (可执行文件名 "main.cpp" 所有相关的.c和.cpp文件)

?⑨将目标文件与库文件进行链接

target_link_libraries(server1 -lddsrpcc  -lddsc -lpthread -lpaho-mqtt3a -lpaho-mqtt3as -lpaho-mqtt3c -lpaho-mqtt3cs -lssl -lcrypto)

也就是

target_link_libraries(可执行文件名 -相关的动态库)


完整的代码示

为了方便同学们理解,此处做个完整的示例

# CMakeList.txt: Demo 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

project ("Demo")
set(CMAKE_C_FLAGS "$ENV{CFLAGS} -O2 -Wall -pthread")
set(CMAKE_CXX_FLAGS "$ENV{CFLAGS} -O2 -Wall -pthread -std=c++11")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(GEN_DEST ${CMAKE_CURRENT_SOURCE_DIR}/gen/)
set(DDS_LIB ${CMAKE_CURRENT_SOURCE_DIR}/lib/)

file(GLOB_RECURSE ca_gen_srcs_cpp ${GEN_DEST}/src/*.cpp)
file(GLOB_RECURSE ca_gen_srcs_c ${GEN_DEST}/src/*.c)
file(GLOB_RECURSE mqtt_c ${CMAKE_CURRENT_SOURCE_DIR}/tools/mqtt/*.cpp)
file(GLOB_RECURSE json_c ${CMAKE_CURRENT_SOURCE_DIR}/tools/JSON/*.c)
file(GLOB_RECURSE uart_cpp ${CMAKE_CURRENT_SOURCE_DIR}/tools/uart/*.cpp)
file(GLOB_RECURSE usr_srcs_cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)


include_directories(${GEN_DEST}/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/tools)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/tools/mqtt)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/tools/JSON)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/tools/uart)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/tools/spdlog)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

set(ALL_COMPILE_SRC
    ${source_c}
    ${ca_gen_srcs_cpp}
    ${ca_gen_srcs_c}
    ${uart_cpp}
    ${mqtt_c}
    ${json_c}
    ${usr_srcs_cpp}
)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)

# 将源代码添加到此项目的可执行文件。
add_executable (server1 "server.cpp" ${ALL_COMPILE_SRC})
add_executable (client1 "client.cpp" ${ALL_COMPILE_SRC})
add_executable (client2 "client1.cpp" ${ALL_COMPILE_SRC})

target_link_libraries(server1 -lddsrpcc  -lddsc -lpthread -lpaho-mqtt3a -lpaho-mqtt3as -lpaho-mqtt3c -lpaho-mqtt3cs -lssl -lcrypto)
target_link_libraries(client1 -lddsrpcc  -lddsc -lpthread -lpaho-mqtt3a -lpaho-mqtt3as -lpaho-mqtt3c -lpaho-mqtt3cs -lssl -lcrypto)
target_link_libraries(client2 -lddsrpcc  -lddsc -lpthread -lpaho-mqtt3a -lpaho-mqtt3as -lpaho-mqtt3c -lpaho-mqtt3cs -lssl -lcrypto)
# TODO: 如有需要,请添加测试并安装目标。

编译

接下来就开始见证编译时刻了。

在项目根目录下,创建个build文件(为啥是build呢,笔者认为应该是行业规范吧)

命令行代码:
cd 该项目根目录下
mkdir build
cd build

到该build路径后,开始预编译,再编译

cmake ..
make

make完后,在build目录下就应该会有可执行文件了!


简评

? ? ? ? 为了不要让同学们有傻瓜式照搬的思想,我还是以我的这个实际情况来讲述的,同学们需要自行发散性思考,举一反三,学到了,才是自己的。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:19:49  更:2022-03-04 15:20:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:32:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码