VScode利用嵌套CMake编译需要生成两个可执行文件的项目

目录

前言

项目介绍

cmake配置

build与其结果

运行可执行文件


前言

         在我们开发项目的时候,经常会碰到项目很大,而且可能不止要输出一个可执行文件的情况。这时候就可以利用CMake对项目进行统一的管理与编译。

        CMake是一个跨平台的构建系统工具,用于管理软件项目的构建过程。CMake的主要目标是提供一个简单、高效和可扩展的方式来生成各种不同平台和编译器下的构建脚本。CMake支持嵌套结构,我们可以在一个CMakeLists.txt文件中使用add_subdirectory()函数来引入其他目录中的CMakeLists.txt文件。这样可以形成CMake项目的嵌套结构。

        本文对CMake 保姆级教程【C/C++】_哔哩哔哩_bilibili视频中的教程进行总结,并应用到其他项目中。

        CMake的基本操作可以参考我的另一篇博客:利用cmake配置VScode的C++运行与调试环境

项目介绍

        该项目是一个用线程池实现的包含客户端与服务器端的简单网络编程实例。项目主要的需求是:

  1. 编译得到一个Client.exe文件
  2. 线程池相关文件打包成一个静态库,供服务器端代码进行简单的调用
  3. 利用上面的静态库编译得到一个Server.exe文件

        项目文件结构如下:

        client文件夹存放客户端代码,ThreadPool文件夹存放线程池实现的文件代码,server文件夹存放服务器端代码

        实现思路:在文件夹同级中编写一个CMakeLists.txt文件,用于管理整个大项目,在其中使用add_subdirectory()函数引入clientserverThreadPool目录中的CMakeLists.txt文件。三个子文件夹中的CMakeLists.txt文件负责各个文件夹的不同操作。

cmake配置

        CMakeLists.txt文件创建位置展示如下:

        首先编辑最外层的CMakeLists.txt文件1,也就是最外层的CMakeLists.txt文件。在这里我们要指定一些子项目中可能用到的一些路径变量,并引入对应的子项目。CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22.1)                              #指定CMake最低版本
project(NetSample)                                                  #指定项目名称

set(LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib)                       #设置静态库输出与调用位置
set(APP_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/output)             #设置生成的可执行文件的输出位置
set(INCLUDE_SERVER_PATH ${CMAKE_CURRENT_SOURCE_DIR}/ThreadPool)     #设置线程池头文件位置,方便server中的文件引入代码

add_subdirectory(client)                                            #导入client文件夹,在这个文件夹中的CMakeLists文件生成一个客户端可执行文件
add_subdirectory(ThreadPool)                                        #导入线程池文件夹,在这个文件夹中的CMakeLists文件制作出一个可供调用的静态库
add_subdirectory(server)                                            #导入server文件夹,在这个文件夹中的CMakeLists文件生成一个服务器可执行文件

 

        下一步编辑client文件夹中的CMakeLists.txt文件2,在这里生成client.exe到指定文件夹

cmake_minimum_required(VERSION 3.22.1)                      #指定最低版本
project(Client)                                             #子项目项目名称

aux_source_directory(${PROJECT_SOURCE_DIR} source)          #在本文件夹中找到TCPClient.cpp源文件,并将其存入source变量中
set(EXECUTABLE_OUTPUT_PATH ${APP_OUTPUT_PATH})              #设置可执行文件输出位置,APP_OUTPUT_PATH在最外层CMakeLists定义

add_executable(client ${source})                            #生成client.exe
    
target_link_libraries(client ws2_32)                        #给client.exe链接一些需要的动态库

        接下来编辑ThreadPool中的CMakeLists.txt文件3,制作静态库libMyThreadPoolLib.a,输出到指定文件夹

cmake_minimum_required(VERSION 3.22.1)                         #指定最低版本
project(ThreadPoolLib)                                         #子项目项目名称

aux_source_directory(${PROJECT_SOURCE_DIR} source)             #找到制作静态库所需的源文件,存入source变量中
include_directories(ThreadPool)                                #指定头文件所在的文件夹

set(LIBRARY_OUTPUT_PATH  ${LIB_PATH})                          #指定静态库生成后存储的位置
message(${LIBRARY_OUTPUT_PATH})                                #打印该位置
link_libraries(pthread)                                        #向该静态库中再链接一个要用到的库
find_package(Threads REQUIRED)                                 #寻找系统安装的pthread库

add_library(MyThreadPoolLib STATIC ${source})                  #生成静态库
target_link_libraries(MyThreadPoolLib Threads::Threads ws2_32) #链接要用的动态库到静态库中

        最后编辑server文件夹下的CMakeLists.txt文件4,利用刚刚生成的静态库得到一个server.exe可执行文件,存入指定目录。

cmake_minimum_required(VERSION 3.22.1)                  #指定最低版本
project(server)                                         #子项目名称

include_directories(${INCLUDE_SERVER_PATH})             #指定头文件所在位置,以防在TcpServerThreadPool.cpp文件中找不到头文件
link_directories(${LIB_PATH})                           #指定静态库所在位置
link_libraries(MyThreadPoolLib)                         #链接静态库

aux_source_directory(${PROJECT_SOURCE_DIR} source)      #找到TcpServerThreadPool.cpp文件,并将其存入source


set(EXECUTABLE_OUTPUT_PATH ${APP_OUTPUT_PATH})          #设置可执行文件输出位置
add_executable(server ${source})                        #生成可执行文件

        下一步就是配置CMake,首先在VScode中按下组合键shift+Ctrl+p,弹出搜索框。输入CMake:configure。

        选择一个自己环境中的编译器,比如我这选的GCC8.1.0

        等待配置完毕,配置完毕后会生成一个build文件夹,并输出以下内容:

        

        下一步我们要进入build文件夹,利用cmake命令生成Makefile文件。所以我们需要新建一个终端,在终端中输入cd build进入build文件夹)与cmake ..利用刚刚写好的CMakeLists.txt生成Makefile文件,如果输入cmake报错,可以尝试输入:cmake .. -G "MinGW Makefiles"

        执行cmake ..的效果是在build文件夹中生成构建系统所需的构建文件,成功运行完这两条命令后输出done,就可以进行下一步build了

build与其结果

        在终端中输入命令:mingw32-make按照之前的CMakeLists.txt编译整个项目。(注:可以将编译器中的mingw32-make.exe复制一份,重命名为make.exe,这样以后就可以输入make命令就可以直接编译,方便一点)

编译完成后,检查文件结构,发现多了几个文件夹,这几个都是我们刚刚在CMakeLists文件中指定的,而且文件夹中都有我们需要的结果,说明编译成功。

运行可执行文件

        生成的服务器是用线程池的多线程机制实现的,所以我们可以打开多个客户端和一个服务器端同时交互。

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,VSCode是一款开源且功能强大的集成开发环境(IDE),可用于编写多种编程语言,并拥有各种实用的插件和扩展。 要在VSCode中使用CMake生成可执行文件,您需要按照以下步骤进行操作: 1. 安装VSCodeCMake插件:首先,您需要在计算机上安装VSCodeCMake。在安装VSCode之后,您可以通过扩展市场安装CMake插件,这将使您能够在VSCode中使用CMake命令。 2. 创建CMakeLists.txt文件:在您的项目根目录下创建一个名为`CMakeLists.txt`的文件。这个文件是用来定义CMake构建项目所需的配置信息的。 3. 编写CMake配置:在`CMakeLists.txt`文件中,您需要编写CMake的配置指令,以告诉CMake如何构建您的项目。这些指令包括设置项目名称、设置编译器、添加源文件、定义可执行目标等等。 4. 打开终端:在VSCode中,您可以通过点击顶部菜单中的"终端"选项,然后选择"新终端"来打开终端。 5. 在终端中输入CMake命令:在打开的终端中,您可以输入CMake命令来生成可执行文件。例如,您可以使用`cmake .`命令来生成Makefile,并使用`make`命令来构建可执行文件。 6. 运行可执行文件:一旦构建完成,您可以在终端中运行生成可执行文件。使用`./<可执行文件名>`命令来运行您的程序。 总结:通过安装VSCodeCMake插件,创建CMakeLists.txt文件并编写CMake配置,然后在VSCode中的终端中使用CMake命令来生成和构建可执行文件。然后,您可以使用终端来运行生成可执行文件。希望这个回答对您有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值