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_NAMEproject命令中写的项目名
      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_PATHfind_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(tutorial
		LANGUAGES 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_LIST
	tutorial-00-helloworld
	tutorial-01-wget
	tutorial-04-http_echo_server
	tutorial-05-http_proxy
	tutorial-06-parallel_wget
	tutorial-07-sort_task
	tutorial-08-matrix_multiply
	tutorial-09-http_file_server
	tutorial-11-graph_task
	tutorial-15-name_service
	tutorial-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_LIST
	tutorial-02-redis_cli
	tutorial-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_LIST
	tutorial-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 PROPERTIES
	RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10})
set_target_properties(client PROPERTIES
	RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/${DIR10})

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Modern CMake是指使用CMake3.1及以上版本的一种现代化的CMake编写和构建项目的方法。它的目标是让CMake的代码更加整洁、强大和优雅,以便开发者能够将更多精力放在编码上。Modern CMake引入了一些新的概念和技术,以提供更好的构建和管理项目的方式。 在Modern CMake中,项目被视为一个实体,可以是一个文件、一个库、一个属性表,甚至是一组命令。它通过接口(interface)和私有(private)来区分与其他项目的使用,从而简化了编译和链接的逻辑,使得管理项目变得更加清晰。 Modern CMake推崇将CMake作为代码来对待,就像其他代码一样,应该写得干净易读。它鼓励使用目标(targets)的思维来组织项目,并提倡将常用功能封装为函数或宏。此外,使用别名来保持一致性,在编写Config.cmake文件时提供支持,以及使用小写字母命名函数和宏等都是Modern CMake的正确模式。 同时,Modern CMake也提供了一些标准选项和命令来帮助开发者更好地控制项目的构建和安装。比如,可以通过设置编译类型选项(-DCMAKE_BUILD_TYPE)来指定编译类型,可以通过设置本地安装路径选项(-DCMAKE_INSTALL_PREFIX)来指定安装路径。此外,也可以使用cmake_policy命令添加版本号等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [[笔记]Modern CMake 1:Modern CMake简介](https://blog.csdn.net/chlk118/article/details/90737791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [modern cmake的概念剖析](https://blog.csdn.net/KeLiaoo/article/details/110624377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值