cmake知识点总结

本文详细介绍了如何使用CMake进行项目配置和构建,包括CMakeLists.txt的编写规则,项目的目录结构设置,以及如何生成动态库和可执行文件。通过实际案例,展示了如何设置编译选项,添加头文件和库文件搜索路径,以及链接外部库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  CMake的所有的语句都写在一个叫 CMakeLists.txt 的文件中。当 CMakeLists.txt 文件确定后,可以用 ccmake 命令对相关的变量值进行配置。这个命令必须指向 CMakeLists.txt 所在的目录。配置完成之后,应用 cmake 命令生成相应的 makefile。

一、项目的目录结构

  • src:源文件
  • inc:头文件
  • test:测试文件,主函数入口
  • proto:proto文件
  • log:项目产生的日志文件
  • build:在此文件夹中构建项目,不污染源文件
  • bin:生成的可执行文件
  • build.sh:cmake的脚本

二、实例说明Cmake编写规则

  src文件下的CMakeLists.txt

# 指定CMake编译最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 将C++文件赋值给变量SRC_LIST_Server
SET(SRC_LIST_Server 
    ChatServer.cpp 
    ChatSystem.pb.cc 
    ChatStatus.pb.cc 
    Mysql.cpp 
    Redis.cpp
)
SET(SRC_LIST_Client 
    ChatClient.cpp 
    ChatSystem.pb.cc 
    ChatStatus.pb.cc 
    Mysql.cpp 
    Redis.cpp
)

# 设置编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpthread -g -Wall")

# 查找protobuf头文件
# find_package(Protobuf REQUIRED)
# if(PROTOBUF_FOUND)
#   message(STATUS "protobuf library found")
# else()
#    message(FATAL_ERROR "protobuf library is needed but cant be found")
# endif()
#include_directories(${PROTOBUF_INCLUDE_DIRS})

# 指定头文件和库文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/inc)
# 指定生成库文件的目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES(/usr/local/include/google/protobuf)
INCLUDE_DIRECTORIES(/usr/local/boost/include)
INCLUDE_DIRECTORIES(/usr/include/mysql)
INCLUDE_DIRECTORIES(/usr/local/include/hiredis)
INCLUDE_DIRECTORIES(/usr/local/include/glog)

LINK_DIRECTORIES(/usr/local/boost/lib)

# 生成库文件,默认生成静态库,SHARED指定生成库类型为动态库
ADD_LIBRARY(chatserver SHARED ${SRC_LIST_Server})
ADD_LIBRARY(chatclient SHARED ${SRC_LIST_Client})

# 需要链接的库文件
TARGET_LINK_LIBRARIES(chatserver
                      protobuf
                      hiredis
                      mysqlclient
                      glog
)
TARGET_LINK_LIBRARIES(chatclient
                      protobuf
                      hiredis
                      mysqlclient
                      glog
)

  test文件下的CMakeLists.txt

# 指定CMake编译最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 将Server.cpp赋值给Server变量
SET(Server Server.cpp)
SET(Client Client.cpp)

# 设置编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lpthread -g -Wall")

# 设置生成的执行文件的输出目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)

INCLUDE_DIRECTORIES(/usr/local/include/google/protobuf)
INCLUDE_DIRECTORIES(/usr/local/boost/include)
INCLUDE_DIRECTORIES(/usr/include/mysql)
INCLUDE_DIRECTORIES(/usr/local/include/hiredis)
INCLUDE_DIRECTORIES(/usr/local/include/glog)
LINK_DIRECTORIES(/usr/local/boost/lib)

# 生成可执行文件server,依赖于Server.cpp
ADD_EXECUTABLE(server ${Server})
ADD_EXECUTABLE(client ${Client})

# 指定server的链接库chatserver和protobuf
TARGET_LINK_LIBRARIES(server chatserver)
TARGET_LINK_LIBRARIES(client chatclient)

【指令说明】:

  • CMAKE_MINIMUM_REQUIRED:声明Cmake版本,如果低于指定版本则会停止处理工程文件,并报告错误。
  • SET:定义变量并赋值。
  • CMAKE_CXX_FLAGS:设置编译选项。
  • PROJECT_SOURCE_DIR:预定义的变量。
  • ${}:取值。
  • INCLUDE_DIRECTORIES:向工程添加多个特定的头文件搜索路径,路径之间用空格分隔。
  • LINK_DIRECTORIES:添加非标准的共享库搜索路径。
  • ADD_LIBRARY:生成动态库或静态库。
  • TARGET_LINK_LIBRARIES:为TARGET添加需要链接的共享库。
  • ADD_EXECUTABLE:生成可执行文件。

【运行说明】:

#!bin/bash

protoc -I=./proto/ --cpp_out=./proto ./proto/ChatSystem.proto
mv ./proto/ChatSystem.pb.h ./inc/ChatSystem.pb.h
mv ./proto/ChatSystem.pb.cc ./src/ChatSystem.pb.cc

if [ ! -e ./build ]
then 
    mkdir build
else 
    rm -rf build/*
fi

if [ ! -e ./bin ]
then  mkdir bin
else rm -rf bin/*
fi

if [ ! -e ./log ]
then  mkdir log
else rm -rf log/*
fi

if [ ! -e ./lib ]
then  mkdir lib
else rm -rf lib/*
fi

cd build
cmake ..
make

参考:https://github.com/carl-wang-cn/demo/tree/master/cmake
https://www.cnblogs.com/flyinggod/archive/2017/11/08/7805587.html

### Qt 知识点总结 #### 1. Qt 版本更新与主要变化 Qt 6 是继 Qt 5 后的重大版本升级,其核心改进集中在底层架构优化以及新特性的引入。相比 Qt 5,Qt 6 舍弃了一些过时的类和接口,并新增了许多现代化的功能支持[^1]。以下是几个关键的变化: - **新的图形架构**:Qt 6 改进了渲染引擎,提升了跨平台兼容性和性能。 - **CMake 构建系统**:取代 qmake 成为主要构建工具,增强了模块化设计和支持复杂项目的灵活性。 - **移除旧有 API**:为了保持框架轻量化,部分 Qt 5 中已标记为废弃的组件被彻底删除。 #### 2. 创建首个 Qt 应用程序 当开发者通过 Qt Creator 新建一个基于 Widgets 的应用时,默认生成的基础代码涵盖了窗口初始化、事件处理机制等内容[^2]。具体流程如下描述(不涉及步骤词汇): 项目创建完成后自动生成 main.cpp 和 MainWindow.ui 文件,其中定义了一个继承 QMainWindow 类型的对象实例。此对象负责管理主窗体布局及其关联控件属性设定;同时连接信号槽用于响应用户交互操作。 #### 3. 绘制与样式定制 对于需要个性化外观的应用场景而言,掌握如何调整部件视觉效果至关重要。例如更改 QWidget 子类背景颜色可通过两种方式实现——重载 paintEvent 方法或者修改 QPalette 参数设置[^4]: ```cpp // 方式一:重写 Paint Event 实现自定义绘制逻辑 void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); QBrush brush(Qt::red); // 设定红色填充色 painter.fillRect(rect(), brush); } // 方式二:利用 Palette 更改全局配色方案 QPalette palette; palette.setColor(QPalette::Window, Qt::green); setAutoFillBackground(true); setPalette(palette); ``` #### 4. 工具链集成与发展环境搭建 成功部署开发套件后验证环境有效性非常重要。按照官方文档指导完成相应依赖库安装过程之后,尝试建立简易 demo 来确认各项功能正常运作情况[^3]。如果一切顺利,则可进一步探索高级主题比如多线程编程模型或是多媒体播放器插件扩展等功能模块。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~青萍之末~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值