多级文件夹使用cmake创建工程

1 篇文章 0 订阅
文章描述了一个使用CMake构建包含多个子目录的工程的过程,包括设置输出路径、启用OpenMP、处理Qt5依赖库,并通过配置文件复制必要的dll到执行目录。CMakeLists.txt文件的内容和结构被详细解释,展示了如何组织项目源码和资源。
摘要由CSDN通过智能技术生成
目前cmake是一个比较流行的编译工具, 当工程放在多级文件夹中时,如何使用cmake让其成为一个完成的功能,下面是我自己在项目中的一个小工程使用cmake进行编译创建功能:
首先我的源码是code文件夹,code文件包含两个文件夹一个是image文件夹另一个是.cpp和.h文件,最终使用cmake构建后再code同级文件夹生成output文件夹用来进行最终的exe输出的,这其中包含Release和Debug,bulid文件夹是在使用cmake时手动创建,用来存放vs启动工程

在这里插入图片描述

code中的内容如下:

在这里插入图片描述

其中CMakeList.txt内容:
cmake_minimum_required(VERSION 3.6 FATAL_ERROR)
project(CheckOutTool VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
cmake_policy(SET CMP0079 NEW)

project(CheckOutTool)
include (FindOpenMP)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
if (OPENMP_FOUND)
  message("build with openmp")
  set (HAVE_OPENMP TRUE)
  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
endif()

include("${PROJECT_SOURCE_DIR}/macro.cmake")
add_definitions(-D_BIND_TO_CURRENT_VCLIBS_VERSION=1)
add_definitions(-D_UNICODE -DUNICODE)
add_definitions(-DPROTOBUF_USE_DLLS)
add_definitions(-D_CRT_SECURE_NO_WARNINGS) 

string(REGEX REPLACE "/code" "" PROJECT_OUTPUT_DIR ${PROJECT_SOURCE_DIR})
set(PROJECT_OUTPUT_DIR "${PROJECT_OUTPUT_DIR}/output")
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_OUTPUT_DIR}")
set(LIBRARY_OUTPUT_PATH "${PROJECT_OUTPUT_DIR}")
option (GENERATE_DEBUG_INFO "always generate debug info" OFF)
SET(CMAKE_DEBUG_POSTFIX d)

subdirs(Source)

macro.cmake中的内容为:
//文件说明
**# Copy files from source directory to destination directory, substituting any
# variables.  Create destination directory if it does not exist.**


macro(configure_files srcDir destDir)
   # message(STATUS "Configuring directory ${destDir}")
    make_directory(${destDir})

    file(GLOB templateFiles RELATIVE ${srcDir} ${srcDir}/*)///*表示原目录下的所有文件
    foreach(templateFile ${templateFiles})
        set(srcTemplatePath ${srcDir}/${templateFile})
        if(NOT IS_DIRECTORY ${srcTemplatePath})
#            message(STATUS "Configuring file ${templateFile}")
            configure_file(
                    ${srcTemplatePath}
                    ${destDir}/${templateFile}
                    COPYONLY IMMEDIATE)
		else(NOT IS_DIRECTORY ${srcTemplatePath})
			make_directory(${destDir}/${templateFile})
			configure_files(${srcTemplatePath} ${destDir}/${templateFile})
        endif(NOT IS_DIRECTORY ${srcTemplatePath})
    endforeach(templateFile)
endmacro(configure_files)


macro(configure_files_selected srcDir files destDir)
  # message(STATUS "Configuring directory ${destDir}")
  make_directory(${destDir})
  file(GLOB templateFiles RELATIVE ${srcDir} ${srcDir}/${files})
  foreach(templateFile ${templateFiles})
    set(srcTemplatePath ${srcDir}/${templateFile})
    if(NOT IS_DIRECTORY ${srcTemplatePath})
      #            message(STATUS "Configuring file ${templateFile}")
      configure_file(
        ${srcTemplatePath}
        ${destDir}/${templateFile}
        COPYONLY IMMEDIATE)
    endif(NOT IS_DIRECTORY ${srcTemplatePath})
  endforeach(templateFile)
endmacro(configure_files_selected)

Source文件夹中的结构如下:

在这里插入图片描述

其中CMamkeLists.txt中的内容主要是该工程的一些依赖项和将动态库拷贝到exe同目录,内容为:
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/Source/workFile/)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

#set(src main.cpp CheckOutWin.cpp CheckOutWin.h ReadFile.cpp ReadFile.h SerialPortMonitoring.cpp SerialPortMonitoring.h ToolDataModel.cpp ToolDataModel.h UDPNet.cpp UDPNet.h)
include("${PROJECT_SOURCE_DIR}/Source/workFile/src.cmake")

add_executable(CheckOutTool WIN32 ${src} ${PROJECT_SOURCE_DIR}/Source/image/Resource.qrc)

find_package(Qt5 COMPONENTS Core Gui Widgets NetWork SerialPort )
target_link_libraries(CheckOutTool
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::SerialPort
Qt5::Network)

set_target_properties(CheckOutTool  PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/../output/$(Configuration)")

set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT CheckOutTool)

FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Cored.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Widgetsd.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Guid.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Core.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Widgets.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Gui.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Networkd.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5Network.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5SerialPortd.dll DESTINATION ${PROJECT_OUTPUT_DIR}/debug/)
FILE(COPY ${_qt5Widgets_install_prefix}/bin/Qt5SerialPort.dll DESTINATION ${PROJECT_OUTPUT_DIR}/release/)

configure_files("${_qt5Widgets_install_prefix}/plugins/platforms" "${PROJECT_OUTPUT_DIR}/debug/platforms")
configure_files("${_qt5Widgets_install_prefix}/plugins/platforms" "${PROJECT_OUTPUT_DIR}/release/platforms")
在workFile文件夹中是.cpp和.h文件,但是其中有一个src.cmake文件,是将.cpp和.h文件放入到一边src变量中在Source文件夹中的CMakeLists.text中使用
set(dir "${PROJECT_SOURCE_DIR}/Source/workFile")
set(work_source
${dir}/main.cpp
${dir}/CheckOutWin.cpp
${dir}/ReadFile.cpp
${dir}/SerialPortMonitoring.cpp
${dir}/ToolDataModel.cpp
${dir}/UDPNet.cpp
)

set(work_header
${dir}/ReadFile.h
${dir}/CheckOutWin.h
${dir}/SerialPortMonitoring.h
${dir}/ToolDataModel.h
${dir}/UDPNet.h
)

source_group(workFile FILES ${work_source} ${work_header})
set(src ${src} ${work_source} ${work_header})
使用VSCode和CMake创建工程时,可以按照以下步骤进行操作: 1. 安装VSCode:首先,你需要下载并安装Visual Studio Code(简称VSCode),它是一个轻量级的代码编辑器,支持多种编程语言和插件扩展。 2. 安装CMake插件:在VSCode中,你可以通过安装CMake插件来支持CMake项目的创建构建。打开VSCode,点击左侧的扩展图标(或按下Ctrl+Shift+X),搜索并安装"CMake Tools"插件。 3. 创建工程文件夹:在你的工作目录创建一个新的文件夹,用于存放你的CMake工程文件。 4. 创建CMakeLists.txt文件:在工程文件夹创建一个名为"CMakeLists.txt"的文件,该文件是CMake项目的核心配置文件。在该文件中,你需要指定项目的名称、源文件、编译选项等信息。 5. 配置CMake插件:打开VSCode的设置(按下Ctrl+逗号),搜索"CMake"相关的设置项,并根据你的需求进行配置。例如,你可以设置CMake的路径、构建目录、生成器等。 6. 构建项目:在VSCode中打开工程文件夹,点击左侧的CMake图标(或按下Ctrl+Shift+P,输入"CMake: Build"),选择合适的构建目标进行项目构建CMake插件会自动执行CMake命令,生成构建系统所需的Makefile或其他构建文件。 7. 运行和调试:完成项目构建后,你可以使用VSCode的调试功能来运行和调试你的程序。配置调试器(如GDB)并设置断点,然后点击调试按钮即可开始调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pailugou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值