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目录下就应该会有可执行文件了!


简评

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

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星羽空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值