CMakeList笔记
定义
CMake是一种跨平台编译工具,CMake主要是编写CMakeLists.txt文件,然后通过cmake命令将CMakeLists.txt文件转化为make所需要的Makefile文件,最后用make命令编译源码生成可执行程序或者库文件。
语法规则
CMakeLists.txt常见指令
1、cmake_minimum_required(VERSION 2.6)命令
#指定CMake编译最低要求版本
例:CMAKE_MINIMUM_REQUIRED(VERSION 3.14)2、PROJECT(<projectname>)命令
#给项目命名
PROJECT(TEST)3、ADD_SUBDIRECTORY命令
#该命令告诉CMake去子目录中查看可用的CMakeLists.txt文件4、ADD_EXECUTABLE命令
#将hello.cpp生成可执行文件hello
ADD_EXECUTABLE(hello ${SOURCE})5、ADD_LIBRARY命令
#变量SRC_LIST_CPP 与SRC_LIST_C 指定生成test动态库 默认生成静态库 SHARED指定生成库类型为动态库
ADD_LIBRARY(test SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})
ADD_LIBRARY(test STATIC util.cpp) # 生成静态库6、FILE命令
#收集c/c++文件并赋值给变量SRC_LIST_CPP ${PROJECT_SOURCE_DIR}代表区当前项目录
FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)7、INCLUDE_DIRECTORIES命令
#指定头文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)8、LINK_DIRECTORIES命令
#指定链接库文件目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)9、TARGET_LINK_LIBRARIES命令
#指定hello 链接库test
TARGET_LINK_LIBRARIES(hello test)10、AUX_SOURCE_DIRECTORY命令
#AUX_SOURCE_DIRECTORY(dir VAR) 发现一个目录下所有的源代码文件并将列表存储在一个变量中
AUX_SOURCE_DIRECTORY(. SRC_LIST) # 搜索当前目录下的所有.cpp文件,放到SRC_LIST变量中8、SET命令
#用来显式的定义变量
例子:
#用变量代替值,例子中定义SRC_LST代替后面的字符串
SET (SRC_LST main.c test.c)
#指定生成库文件的目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)- 常用变量
变量名 含义 JECT_NAME project命令中写的项目名 KE_VERSION 当前使用CMake的版本 KE_SOURCE_DIR 工程顶层目录,即入口CMakeLists文件所在路径 JECT_SOURCE_DIR 同CMAKE_SOURCE_DIR KE_BINARY_DIR 工程编译发生的目录,即执行cmake命令进行项目配置的目录,一般为build JECT_BINARY_DIR 同CMAKE_BINARY_DIR KE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径 KE_CURRRENT_BINARY_DIR 当前处理的CMakeLists.txt中生成目标文件所在编译目录 KE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt文件的完整路径 KE_CURRENT_LIST_DIR 当前处理的CMakeLists.txt文件所在目录的路径 KE_INSTALL_PREFIX 指定make install命令执行时包安装路径 KE_MODULE_PATH find_package命令搜索包路径之一,默认为空 KE_BUILD_TYPE 编译选项,Release或者Debug,如set(CMAKE_BUILD_TYPE “Release”) KE_CXX_FLAGS 编译标志,设置C++11编译,set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11”)
例子
#指定CMake编译最低要求版本3.6
cmake_minimum_required(VERSION 3.6)#CMAKE_BUILD_TYPE 代替后面的字符串RelWithDebInfo CACHE STRING "build type"
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "build type")#给项目命名tutorial
project(tutorialLANGUAGES C CXX
)#CMAKE_RUNTIME_OUTPUT_DIRECTORY 代替后面的字符串${PROJECT_SOURCE_DIR}
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})if(ANDROID)#指定链接库文件目录${OPENSSL_LINK_DIR}link_directories(${OPENSSL_LINK_DIR})
else()find_library(LIBRT rt)find_package(OpenSSL REQUIRED)
endif()
find_package(workflow REQUIRED CONFIG HINTS ..)
#指定头文件目录${OPENSSL_INCLUDE_DIR} ${WORKFLOW_INCLUDE_DIR}
include_directories(${OPENSSL_INCLUDE_DIR} ${WORKFLOW_INCLUDE_DIR})
#指定链接库文件目录${WORKFLOW_LIB_DIR}
link_directories(${WORKFLOW_LIB_DIR})if (KAFKA STREQUAL "y")find_path(SNAPPY_INCLUDE_PATH NAMES snappy.h)#指定头文件目录${SNAPPY_INCLUDE_PATH}include_directories(${SNAPPY_INCLUDE_PATH})
endif ()if (WIN32)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP /wd4200")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /wd4200 /std:c++14")
else ()#CMAKE_C_FLAGS代替后面的字符串"${CMAKE_C_FLAGS} -Wall -fPIC -pipe -std=gnu90"set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fPIC -pipe -std=gnu90")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -pipe -std=c++11 -fno-exceptions")
endif ()#TUTORIAL_LIST代替后面的字符串
set(TUTORIAL_LISTtutorial-00-helloworldtutorial-01-wgettutorial-04-http_echo_servertutorial-05-http_proxytutorial-06-parallel_wgettutorial-07-sort_tasktutorial-08-matrix_multiplytutorial-09-http_file_servertutorial-11-graph_tasktutorial-15-name_servicetutorial-20-reducer
)if (APPLE)set(WORKFLOW_LIB workflow pthread OpenSSL::SSL OpenSSL::Crypto)
elseif (ANDROID)set(WORKFLOW_LIB workflow ssl crypto c)
else ()set(WORKFLOW_LIB workflow pthread OpenSSL::SSL OpenSSL::Crypto ${LIBRT})
endif ()foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)#将${src}.cc生成可执行文件${bin_name} add_executable(${bin_name} ${src}.cc)#指定${bin_name}链接库${WORKFLOW_LIB}target_link_libraries(${bin_name} ${WORKFLOW_LIB})
endforeach()if (NOT REDIS STREQUAL "n")
set(TUTORIAL_LISTtutorial-02-redis_clitutorial-03-wget_to_redis
)
foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)add_executable(${bin_name} ${src}.cc)target_link_libraries(${bin_name} ${WORKFLOW_LIB})
endforeach()
endif()if (NOT MYSQL STREQUAL "n")
set(TUTORIAL_LISTtutorial-12-mysql_cli
)
foreach(src ${TUTORIAL_LIST})string(REPLACE "-" ";" arr ${src})list(GET arr -1 bin_name)add_executable(${bin_name} ${src}.cc)target_link_libraries(${bin_name} ${WORKFLOW_LIB})
endforeach()
endif()if (KAFKA STREQUAL "y")add_executable("kafka_cli" "tutorial-13-kafka_cli.cc")target_link_libraries("kafka_cli" wfkafka ${WORKFLOW_LIB} z snappy lz4 zstd)
endif ()set(DIR10 tutorial-10-user_defined_protocol)
add_executable(server ${DIR10}/server.cc ${DIR10}/message.cc)
add_executable(client ${DIR10}/client.cc ${DIR10}/message.cc)
target_link_libraries(server ${WORKFLOW_LIB})
target_link_libraries(client ${WORKFLOW_LIB})set_target_properties(server PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10})
set_target_properties(client PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10})
CMakeList笔记相关推荐
- Android NDK 之CmakeList 笔记
前言: 在android ndk 开发中,是经常需要通过cmakelist 来配置 引入库或者编译配置的.这里总结一些常用的cmakelist 中api 语法. 1.add_library 添加库 c ...
- linux编程 —— vscode 开发编译 CMakeList.txt 学习笔记
文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...
- CMakeList常用变量及规则查询笔记
文章目录 1. 常用的变量及规则 ① 预定义变量 ② 系统信息 ③ 主要开关选项 ④ 环境变量 ⑤ 常用规则 2. 项目组织结构 3. 自定义搜索规则 4. 条件控制 if-elseif-else-e ...
- ros 消息队列与缓冲区_[ROS] [笔记(1)] 一个最简单的例子:Hello Robot(消息、发布者与订阅者)...
本例程包含如下内容: 1)创建编译 Package: 2)自定义消息: 3)发布者与订阅者. 0.Hello Robot 的场景: 我们想要完成这样一个场景: 1)有一系列 robot 排成一排(pu ...
- cmake 学习笔记(三) (转)
接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...
- c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针
写在最前 作为在贵乎的第一篇文章吧... 允许我加点废话(求轻喷... 应该是从19年的下半年开始,虽然顶着算法工程师的title,但做的很多事情都是开发了,然后19年12月跳槽之后,到了新的环境并开 ...
- ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行
ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...
- ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...
- ROS 学习笔记(一):工作空间+功能包创建
ROS 学习笔记(一):工作空间+功能包创建 一.创建工作空间(catkin_make编译): 1.创建工作空间 catkin_ws 创建空间.初始化(建立一个文件夹) cd ~ mkdir -p ~ ...
最新文章
- linux宝塔如何开启gzip,宝塔nginx如何开启网站gzip
- nyoj n-1位数
- hdu1443 Joseph(约瑟夫环)
- 【日记】一次程序调优发现的同步IO写的问题,切记
- 使用清华开源镜像安装tensorflow
- java 8 方法引用(method references)
- leetcode45 跳跃游戏II 秒杀所有答案
- 流批一体机器学习算法平台
- 移动Web开发的十条军规
- pycharm中两个.py文件相互调用和传递参数
- linux tcp 断网重连,LIS接口与串口服务器的KeepAlive的重连机制
- WebView·开车指南
- 苹果android投屏,iphone怎么投屏到mac?苹果手机投屏到苹果电脑方法
- IOS引入百度统计热力图崩溃
- Arturia Sound Explorers Collection Belledonne现已上市
- 选择OA,终极“避雷”方法来啦!
- C/C++ 链 表 头插法 尾插法
- 中国金刚石工具产量和出口量均居于全球前列,市场广阔
- 【SpringBoot】SpringBoot常用注解
- VVC之PDPC计算步骤