首页 > 其他分享 >cmake具体示例

cmake具体示例

时间:2024-08-23 17:24:25浏览次数:14  
标签:CMAKE 示例 practice01 SOURCE practice03 practice02 具体 模块 cmake

CMake具体示例

目录结构

project0702/
├── CMakeLists.txt               # 主目录的 CMake 配置文件
├── build/                       # 构建输出目录
│   └── Debug/                   # Debug 模式下的输出目录
├── lib/                         # 存放动态库的目录
│   ├── practice01.dll
│   ├── practice02.dll
│   └── practice03.dll
├── practice01/                  # practice01 模块
│   ├── CMakeLists.txt           # practice01 模块的 CMake 配置文件
│   ├── include/                 # 存放 practice01 模块的头文件
│   │   └── practice01.h
│   └── src/                     # 存放 practice01 模块的源代码
│       └── practice01.cpp
├── practice02/                  # practice02 模块
│   ├── CMakeLists.txt           # practice02 模块的 CMake 配置文件
│   ├── include/                 # 存放 practice02 模块的头文件
│   │   └── practice02.h
│   └── src/                     # 存放 practice02 模块的源代码
│       └── practice02.cpp
├── practice03/                  # practice03 模块
│   ├── CMakeLists.txt           # practice03 模块的 CMake 配置文件
│   ├── include/                 # 存放 practice03 模块的头文件
│   │   └── practice03.h
│   └── src/                     # 存放 practice03 模块的源代码
│       └── practice03.cpp
└── main.cpp                     # 主程序的入口文件

主项目 CMakeLists.txt

代码

cmake_minimum_required(VERSION 3.10)
project(project0702)

# 包含子模块的头文件路径
include_directories(${CMAKE_SOURCE_DIR}/practice01/include)
include_directories(${CMAKE_SOURCE_DIR}/practice02/include)
include_directories(${CMAKE_SOURCE_DIR}/practice03/include)

# 查找主目录下的所有源文件,在这里也就是找到main.cpp
file(GLOB SRC_LISTS ${CMAKE_SOURCE_DIR}/*.cpp)

# 设置可执行文件的输出目录
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/build)

# 添加子模块
add_subdirectory(practice01)
add_subdirectory(practice02)
add_subdirectory(practice03)

# 创建可执行文件
add_executable(project0702 ${SRC_LISTS})

# 链接子模块库
target_link_libraries(project0702 practice01 practice02 practice03)

# 自定义命令:构建后将动态库复制到输出目录
add_custom_command(TARGET project0702 POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/lib/practice01.dll ${CMAKE_SOURCE_DIR}/build/Debug/
)
add_custom_command(TARGET project0702 POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/lib/practice02.dll ${CMAKE_SOURCE_DIR}/build/Debug/
)
add_custom_command(TARGET project0702 POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/lib/practice03.dll ${CMAKE_SOURCE_DIR}/build/Debug/
)

解释

  • include_directories():为主项目添加子模块的头文件路径,以便主项目中的源文件能够找到模块的头文件。
  • file(GLOB SRC_LISTS ...):查找主目录下的所有源文件(如 main.cpp),并将其用于构建可执行文件。
  • set(EXECUTABLE_OUTPUT_PATH ...):设置可执行文件的输出目录为 build/
  • add_subdirectory():将子模块(practice01、practice02、practice03)添加到项目中,使得这些模块可以被构建。
  • add_executable():为项目创建可执行文件 project0702。
  • target_link_libraries():将生成的动态库 practice01、practice02、practice03链接到可执行文件。
  • add_custom_command():在构建后,使用 cmake -E copy 将生成的 .dll文件复制到可执行文件所在的目录,以确保在运行时可以找到并加载动态库。

practice01 的 CMakeLists.txt

代码

cmake_minimum_required(VERSION 3.10)
project(practice01)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
file(GLOB_RECURSE SRC_LISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
add_library(practice01 SHARED ${SRC_LISTS})

解释

  • include_directories():添加 practice01 的头文件路径,使得其他项目可以引用 practice01的头文件
  • file(GLOB_RECURSE ...):递归查找 practice01 模块中的所有 .cpp文件,并将这些文件用于构建动态库
  • set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ...):设置 .dll文件的输出目录
  • set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON):自动导出动态库中的所有符号
  • add_library():创建 practice01 的动态库。

其余同理

总结

  • 子模块的 CMakeLists.txt 文件生成动态库:
    每个子模块(如 practice01、practice02、practice03)的 CMakeLists.txt 文件负责将各自的源代码编译成动态链接库(.dll 或 .so 文件)。这些动态库封装了子模块的功能,并可以在项目的其他部分中使用。
  • 主项目的 CMakeLists.txt 文件整合这些动态链接库:
    主项目的 CMakeLists.txt 文件负责将这些生成的动态链接库链接到主程序的可执行文件中(如 project0702.exe)。它通过 target_link_libraries() 命令,将子模块的动态库链接到主程序的主函数(如 main.cpp 中的 main() 函数)。
    同时,主项目的 CMakeLists.txt 还可以通过自定义命令(add_custom_command())确保在运行时,这些动态库(.dll 文件)被复制到可执行文件所在的目录,使得主程序能够加载这些动态库并使用其中的功能。
  • 如果是静态链接库就不用移到exe文件的文件夹内了,在把静态的.lib文件链接到main.cpp当中后, main.exe就可以之间执行,不需要在运行时进行动态加载。

标签:CMAKE,示例,practice01,SOURCE,practice03,practice02,具体,模块,cmake
From: https://blog.csdn.net/jiuzhongxian_/article/details/141295629

相关文章

  • 体育数据API纳米奥运会数据API:高阶数据包接口文档API示例⑧
    纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口,无请求次数限制,可按需购买,接口稳定高效;覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。纳米数据API2.0版本包含http协议以及websocket协议,主要通过http获取数......
  • K8S之Ingress常用Nginx、Traefik示例
    NginxIngress创建Pod、Service,定义如下nginx-ingress-demo.yamlapiVersion:extensions/v1beta1kind:Deploymentmetadata:name:nginx-deploynamespace:defaultspec:replicas:3selector:matchLabels:app:nginx-demoreplease:canary......
  • 实战:软件架构系列之【早期微服务架构Spring Cloud Netflix中的5大组件示例】
    概叙科普文:万字细说微服务及其框架Netflix,SpringCloud,SpringCloudAlibaba梳理_微服务netflixalibaba-CSDN博客科普文:微服务之技术选型SpringCloudAlibaba_微服务架构图阿里巴巴-CSDN博客SpringCloudNetflix是SpringCloud生态系统中最早期的一个子项目,它为Spr......
  • python socket编辑示例 UDP
    服务端:fromsocketimportsocket,AF_INET,SOCK_DGRAMrecv_socket=socket(AF_INET,SOCK_DGRAM)recv_socket.bind(('127.0.0.1',8888))whileTrue:data,addr=recv_socket.recvfrom(1024)#接收数据print('客户说:',data.decode('......
  • python socket编辑示例
    服务端代码:fromsocketimportsocket,AF_INET,SOCK_STREAM#1.创建socket对象AF_INET:用于internet之间的进程通信,SOCK_STREAM:表示TCP协议server_socket=socket(AF_INET,SOCK_STREAM)#2.绑定ip和端口号ip='127.0.0.1'port=8888server_socket.bind((ip,p......
  • CMake编译不同文件目录下的C++文件
        由于我们构建一个项目的时候,通常不会将所有的源文件放在一个文件目录下,这样既不方便开发,也不方便源码阅读,我们通常会对项目文件进行分层,比如分为include、src、res、lib这些目录,src下又分为model、controller、view这些目录。所以跨文件编译C++文件就相当必要了,如......
  • 【C/C++ 软件开发模拟面试 集】cmake 相关知识点模拟面试
    摘自:https://zhuanlan.zhihu.com/p/662623216第一轮:基础知识 1.1什么是CMake? 面试官: 请问你能简单描述一下CMake是什么,以及它通常用来做什么吗? 面试者: CMake是一个跨平台的自动化构建系统,主要用来管理软件构建的过程,它使用一个名为CMakeLists.txt的配置文件来指导编......
  • 看了几十篇论文,实现了个专业算法,用threejs做了个三维人员定位系统示例(已开源)
    需求“threejs中能不能给定几组三维坐标(或者CAD绘制的三维多段线),给一个断面形状,直接生成三维管道?”例如原始CAD图如下:要求用threejs获取线的三维坐标数据自动生成的三维管道效果图如下: 分析如果直接对每条线用threejs中的THREE.TubeGeometry去绘制的话,会出现交岔口出......
  • tanstack react-form antd示例
    import{useForm}from"@tanstack/react-form";import{zodValidator}from"@tanstack/zod-form-adapter";import{z}from"zod";importtype{FieldApi}from"@tanstack/react-form";import{Button,Input,Radio......
  • ChatGPT协助论文写作各阶段指令示例
    学境思源,一键生成论文初稿:AcademicIdeas-学境思源AI论文写作在学术论文写作过程中,我们经常面临选题、文献综述、研究设计、数据分析、写作润色等多方面的挑战。人工智能技术的发展为这些挑战提供了新的解决方案。ChatGPT作为一款强大的语言模型,能够在论文写作的各个阶段提......