编写一个CMakeLists.txt文件的一个简单流程

#==========================语法===========================
#设置变量
set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})
#追加变量
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})
#list追加
set(SRC_LIST main.cpp )
list(append SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST})
PROJECT_SOURCE_DIR:工程根目录
PROJECT_BINARY_DIR:运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build
PROJECT_NAME:返回通过project命令定义的项目名称
CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR:target 编译目录
CMAKE_CURRENT_LIST_DIR:CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE:当前所在的行
CMAKE_MODULE_PATH:定义自己cmake模块所在的路径。SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH:重新定义目标链接库的存放位置

BUILD_SHARED_LIBS:这个开关用来控制默认的库编译方式,如果不进行设置,使用add_library又没有指定库类型的情况下,默认编译生成的库都是静态库。如果set(BUILD_SHARED_LIBS ON)后,默认生成的是动态库。
#编译器选项
CMAKE_C_FLAGS:设置C编译选项,也可以通过指令add_definitions()添加
CMAKE_CXX_FLAGS:设置C++编译选项,也可以通过指令add_definitions()添加。
#====================================================
#1 指定cmake最小版本
cmake_minimum_required(VERSION 3.4.1)
####指定编译器
set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.2")
set(CMAKE_C_COMPILER "gcc-4.2")
####配置编译参数
add_compile_options(-std=c++11 -Wall -Werror)  #方法1
set(CMAKE_CXX_FLAGS
	-std=c++11
	-Wall
	-Werror
)
#2 设置项目名称
project(demo) #此命令会引入两个变量 demo_BINARY_DIR   demo_SOURCE_DIR  同时cmake会引入两个等价变量PROJECT_BINARY_DIR PROJECT_SOURCE_DIR (工程的顶级目录)
add_executable(demo demo.cpp)  #生成可执行文件
===========生成库===================
#3 设置编译类型
add_library(common STATIC  util.cpp) #生成静态库
add_library(common SHARED util.cpp) #生成动态库
#add_library 默认生成静态库

#指定编译包含的源文件
add_library(demo demo.cpp test.cpp util.cpp)
#搜索所有的cpp文件
aux_source_directory(. SRC_LIST)
add_library(demo ${SRC_LIST})

#自定义搜索规则
file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_library(demo ${SRC_LIST})
#或者
file(GLOB SRC_LIST ".cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
#或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol  SRC_PROTOCOL_LIST)
add_library(demo ${SRC_LIST} ${SRC_PROTOICOL_LIST})
========================
#4 查找指定的库文件
find_library(VAR name path) #查找到指定的预编译库name,并将它的路径存储在变量VAR中。查找路径可以通过path指定
find_library(
 LIBDB_CXX_LIBRARIES NAMES  db_cxx
 PATHS /usr/lib/ /usr/local/lib/
)
#5 设置包含的目录
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)
#linux下另一种方式设置:包含的目录
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")

#6 设置链接库的搜索目录
link_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/libs
)
#linux下另一种方式设置:链接的目录
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR)}/libs")
#设置target需要链接的库
target_link_libraries(
    #目标库
    demo
    #目标库需要链接的库,log-lib是上面find_library指定的变量名
    ${log-lib}
)
posted @   xing_l  阅读(178)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示