概述
前言
我们在很多第三方库中都能够看到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目录下就应该会有可执行文件了!
简评
为了不要让同学们有傻瓜式照搬的思想,我还是以我的这个实际情况来讲述的,同学们需要自行发散性思考,举一反三,学到了,才是自己的。
最后
以上就是懦弱八宝粥为你收集整理的Liunx下的Cmake编译C/C++程序方法精要前言CMakeLists.txt文件内容结构及其写法完整的代码示编译简评的全部内容,希望文章能够帮你解决Liunx下的Cmake编译C/C++程序方法精要前言CMakeLists.txt文件内容结构及其写法完整的代码示编译简评所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复