AI提示词

写vscode linux c++20 的CMakeLists.txt文件、build、rebuild文件

这是多项目结构,目录结构如下:
projs:
│ build.sh 顶层build.sh
│ CMakeLists.txt 顶层CMakeLists.txt
│ rebuild.sh 顶层rebuild.sh

├─.vscode
│ launch.json 设置preLaunchTask对应tasks.json的构建任务
│ tasks.json 使用对应的项目build.sh构建

├─build
│ ├─server1 项目1的构建目录
│ │
│ ├─server2 项目2的构建目录
│ │
│ └─all 顶层build.sh、rebuild.sh的构建目录

├─out
│ └─bin 构建目标程序输出目录
│ libxxx.so 所有so文件和程序放在一起
│ server1
│ server2

└─src
├─common 公共目录
│ │ CMakeLists.txt 公共CMakeLists
│ │
│ ├─lib1 示例库1目录
│ │ ├─include
│ │ │ lib1.h
│ │ │
│ │ └─lib
│ │ lib2.a
│ │
│ └─lib2 示例库2目录
│ ├─include
│ │ lib2.h
│ │
│ └─lib
│ lib2.a

├─server1 项目1目录
│ build.sh 项目构建文件(所有项目build.sh都一样)
│ CMakeLists.txt 项目CMakeLists(所有项目CMakeLists都一样)
│ main.cpp

└─server2 项目2目录
│ build.sh 项目构建文件(所有项目build.sh都一样)
│ CMakeLists.txt 项目CMakeLists(所有项目CMakeLists都一样)
main.cpp 顶层build创建和cd到build/all目录下调用CMake执行顶层CMakeLists.txt,执行Make(可输入命令行参数Release并传递给CMake) 顶层rebuild删除all目录然后调用build(可输入命令行参数Release并传递给build) 项目build自动获取脚本文件所在目录名为项目名,创建和cd到cd到项目构建目录下调用CMake执行项目CMakeLists.txt,执行Make tasks.json:
对应每一个项目调用build.sh launch.json:
对应每个项目设置preLaunchTask对应tasks.json的构建任务 顶层CMakeLists.txt文件功能要求:
在这里使用add_subdirectory加入子模块(server1、server1)
在这里设置从程序所在目录加载so文件(set_target_properties) 项目CMakeLists.txt文件功能要求:
项目CMakeLists.txt可修改部分:项目名(自动获取CMakeLists所在目录名为项目名)、项目类型(exe、dll动态库、lib静态库)、程序输出目录(OUT_DIR=projs/out/bin)、源码目录列表(SRC_DIRS, 可设置多个)、库目录列表(LIB_DIRS, 可设置多个)
项目CMakeLists include 公共CMakeLists 公共CMakeLists:
无论exe、dll动态库、lib静态库的输出目录都是等于变量OUT_DIR
自动把CMAKE_CURRENT_SOURCE_DIR加入到SRC_DIRS中
自动遍历LIB_DIRS并判断库目录下的include目录是否存在,存在则把LIB_DIR/include目录加入到SRC_DIRS中
搜索SRC_DIRS、LIB_DIRS目录及其子目录,把含有*.h文件的目录加入到变量INC_DIRS中(注意:这是取*.h文件所在目录不是取文件,注意去重)
搜索SRC_DIRS、LIB_DIRS目录及其子目录,把所有*.cpp、*.c、*.cc文件加入到变量SRC_FILES中 搜索LIB_DIRS、OUT_DIR目录及其子目录,把含有*.a或*.so文件的目录加入到变量LINK_DIRS中(注意:这是取*.a文件所在目录不是取文件,注意去重)
搜索LIB_DIRS、OUT_DIR目录及其子目录,把所有*.a或*.so文件都加入到变量LINK_FILES中 变量INC_DIRS 给 include_directories 用
变量LINK_DIRS 给 link_directories 用
变量LINK_FILES 给 target_link_libraries 用 目录相对于变量:CMAKE_SOURCE_DIR 代码行不要太长了 根据以上要求生成相应CMakeLists.txt、build、rebuild

修改后的顶层CMakeLists

#
# 通用Linux C++ CMakeList
#
# ygluu, ai
#
# 2025-04-19 第1次改进
# 2025-04-13 首版
# # 顶层CMakeLists # 最小版本要求
cmake_minimum_required(VERSION 4.0.0) # 解决方案
project(projs) # 在这里增加项目
add_subdirectory(src/server1)
add_subdirectory(src/server2)

修改后的项目CMakeLists

#
# 通用Linux C++ CMakeList
#
# ygluu, ai
#
# 2025-04-19 第1次改进
# 2025-04-13 首版
# # 仅需设置源码目录和库目录,其它的自动搜索 # 项目CMakeLists cmake_minimum_required(VERSION 4.0.0) # 设置项目名称(自动以父目录名为项目名,可修改)
string(REGEX REPLACE ".*/(.*)" "\\1" PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR})
project(${PROJECT_NAME}) # 设置项目类型(可修改)
set(PROJECT_TYPE "EXE") # 可选值:EXE, DLL, LIB # 设置输出目录(可修改,默认*.so放在这里,h文件设置LIB_DIRS)
set(OUT_DIR "../../out/bin") # 设置源码目录列表(可修改,自动搜索子目录,默认包含项目CMakeLists所在目录)
set(SRC_DIRS ) # 设置库目录列表(可修改,自动加入libx/include、libx/lib/*.a)
set(LIB_DIRS
"../common/lib1"
"../common/lib2"
) # 包含公共CMakeLists
include(../Common/CMakeLists.txt)

修改后的公共CMakeLists

双击箭头展开
#
# 通用Linux C++ CMakeList
#
# ygluu, ai
#
# 2025-04-19 第1次改进
# 2025-04-13 首版
# # 公共CMakeLists(被项目CMakeLists include) # **********************************************************************************
# 以下设置公共编译选项 #设置C++标准
set(CMAKE_CXX_FLAGS "-std=c++20")
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "$ORIGIN")
#set(CMAKE_CXX_STANDARD 20)
#set(CMAKE_CXX_STANDARD_REQUIRED True) # 设置调试选项
if(CMAKE_BUILD_TYPE STREQUAL "Release")
message("Build in debug release...")
else()
message("Build in debug mode...")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g") # 添加 -g 参数
endif() # 设置全局编译选项
add_compile_options(
-Wall
-Wextra
-Wpedantic
-Werror
) # 设置全局链接选项
add_link_options(
-Wl,--no-undefined
-Wl,--as-needed
) add_definitions("-Wall -g") # 设置为 debug 模式
set(CMAKE_BUILD_TYPE debug) # **********************************************************************************
# 以下自动搜索路径和文件(无需修改) # 默认加入项目CMakeLists所在目录
list(APPEND SRC_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
# 合并库目录到源目录中并检查目录是否存在
foreach(DIR ${LIB_DIRS})
if(EXISTS "${DIR}/include" OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/include")
list(APPEND SRC_DIRS "${DIR}/include")
endif()
#if(EXISTS "${DIR}/src" OR EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/src")
# list(APPEND SRC_DIRS "${DIR}/src")
#endif()
endforeach()
list(REMOVE_DUPLICATES SRC_DIRS)
set(ERROR_COUNT 0)
foreach(DIR ${SRC_DIRS})
if(NOT EXISTS "${DIR}" AND NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR}")
set(ERROR_COUNT 1)
message(STATUS "Directory does not exist: ${DIR}")
endif()
endforeach()
if (NOT ${ERROR_COUNT} EQUAL 0)
#message(FATAL_ERROR "Dir set error!!!")
endif()
#message("SRC_DIRS: " ${SRC_DIRS}) # 搜索框:搜索 SRC_DIRS 和 LIB_DIRS 的目录及其子目录,把所有 *.h 文件放到变量 INC_FILES 中
set(INC_FILES "")
foreach(DIR ${SRC_DIRS})
file(GLOB_RECURSE FILES "${DIR}/*.h")
list(APPEND INC_FILES ${FILES})
endforeach()
#message("INC_FILES: " ${INC_FILES}) # 从变量 LINK_FILES 中提取目录放到变量 INC_DIRS 中(去重)
set(INC_DIRS "")
foreach(FILE ${INC_FILES})
get_filename_component(FILE_DIR "${FILE}" DIRECTORY)
list(APPEND INC_DIRS ${FILE_DIR})
endforeach()
list(REMOVE_DUPLICATES INC_DIRS)
#message("INC_DIRS: " ${INC_DIRS}) # 搜索 SRC_DIRS 和 LIB_DIRS 的目录及其子目录,把所有 *.cpp、*.c、*.cc 文件加入到变量 SRC_FILES 中
set(SRC_FILES "")
foreach(DIR ${SRC_DIRS})
file(GLOB_RECURSE FILES "${DIR}/*.cpp" "${DIR}/*.cc" "${DIR}/*.c")
list(APPEND SRC_FILES ${FILES})
endforeach()
#message("SRC_FILES: " ${SRC_FILES}) # 搜索 LIB_DIRS 和 OUT_DIR 的目录及其子目录,把所有 *.a 或 *.so 文件都加入到变量 LINK_FILES 中
set(LINK_FILES "")
# 加入输出目录
list(APPEND LIB_DIRS ${OUT_DIR})
foreach(DIR ${LIB_DIRS})
#file(GLOB_RECURSE FILES "${DIR}/*.a" "${DIR}/*.so")
file(GLOB_RECURSE FILES "${DIR}/*.a")
list(APPEND LINK_FILES ${FILES})
endforeach()
#message("LINK_FILES: " ${LINK_FILES}) # 从变量 LINK_FILES 中提取目录放到变量 LINK_DIRS 中(去重)
set(LINK_DIRS "")
foreach(FILE ${LINK_FILES})
get_filename_component(FILE_DIR ${FILE} DIRECTORY)
list(APPEND LINK_DIRS "${FILE_DIR}")
endforeach()
list(REMOVE_DUPLICATES LINK_DIRS)
#message("LINK_DIRS: " ${LINK_DIRS}) # 设置 include 目录
include_directories(${INC_DIRS}) # 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUT_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUT_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUT_DIR}) # 根据项目类型设置目标
if(PROJECT_TYPE STREQUAL "EXE")
add_executable(${PROJECT_NAME} ${SRC_FILES})
elseif(PROJECT_TYPE STREQUAL "DLL")
add_library(${PROJECT_NAME} SHARED ${SRC_FILES})
elseif(PROJECT_TYPE STREQUAL "LIB")
add_library(${PROJECT_NAME} STATIC ${SRC_FILES})
else()
message(FATAL_ERROR "Invalid project type: ${PROJECT_TYPE}")
endif() # 链接库
target_link_options(${PROJECT_NAME} PRIVATE "-Wl,-E")
target_link_directories(${PROJECT_NAME} PUBLIC "${LINK_DIRS}")
foreach(LINK_FILE ${LINK_FILES})
get_filename_component(LINK_NAME ${LINK_FILE} NAME_WE)
string(REPLACE "lib" "" LINK_NAME_NO_PREFIX "${LINK_NAME}")
target_link_libraries(${PROJECT_NAME} PRIVATE "${LINK_NAME_NO_PREFIX}")
endforeach()

模板所有文件下载地址

https://download.csdn.net/download/GuestCode/90645971

AI提示词:通用 vscode linux c++ 项目CMakeLists和bulid模板的更多相关文章

  1. vscode打开django项目pylint提示has not "object" member

    vscode 打开 django 项目提示 has not "object" member 是因为 Django 动态地将属性添加到所有模型类中,所以 ide 无法解析. 解决方案 ...

  2. AI绘画提示词创作指南:DALL·E 2、Midjourney和 Stable Diffusion最全大比拼 ⛵

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 自然语言处理实战系列:https://www.showmeai.tech ...

  3. 免费Midjourney AI绘画Prompt提示词平台合集

    Midjourney AI绘图最关键的地方在于Prompt提示词写的好,一个好的提示词可以让AI模型创造出更优质的绘图,以下是8个免费的Midjourney Prompt提示词辅助平台. ​ 编辑切换 ...

  4. Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】

    一.VsCode 常见的配置 1.取消更新 把插件的更新也一起取消了 2.设置编码为utf-8:默认就是了,不用设置了 3.设置常用的开发字体:Consolas, 默认就是了,不用设置了 字体对开发也 ...

  5. Midjourney 提示词工具(10 个国内外最好最推荐的)

    Midjourney,是一个革命性的基于人工智能的艺术生成器,可以从被称为提示的简单文本描述中生成令人惊叹的图像.Midjourney已经迅速成为艺术家.设计师和营销人员的首选工具(包括像我这样根本不 ...

  6. 【抱怨文】vscode对多项目支持不够友好

    vscode是一个简单的开发工具,启动快,速度快.但是当前1.26版本对多项目支持好像有点问题.命令行有个dotnet sln,但是只能添加新项目,却没有创建解决方案的命令.如果强行添加他会提示没有解 ...

  7. vsCode开发flutter项目

    Visual Studio Code 安装: 下载链接:https://code.visualstudio.com/ 下载完成后根据步骤自行安装.     使用vsCode开发flutter项目需要部 ...

  8. Semantic Kernel 入门系列:🥑突破提示词的限制

    无尽的上下文 LLM的语言理解和掌握能力在知识内容的解读和总结方面提供了强大的能力. 但是由于训练数据本身来自于公共领域,也就注定了无法在一些小众或者私有的领域能够足够的好的应答. 因此如何给LLM ...

  9. Atitit linux获取项目运行环境版本

    Atitit linux获取项目运行环境版本 1.1. Nginx版本1 1.2. Php版本1 1.3. Mysql版本2 1.4. Redis版本2 1.1. Nginx版本 [root@iZ25 ...

  10. linux Java项目CPU内存占用高故障排查

    linux Java项目CPU内存占用高故障排查 top -Hp 进程号 显示进程中每个线程信息,配合jstack定位java线程运行情况 # 线程详情 jstack 线程PID # 查看堆内存中的对 ...

随机推荐

  1. 路由协议过程概述--ospf-01

    路由是数据通信网络中最基本的要素.路由信息就是指导报文发送的路径信息,路由的过程就是报文转发的过程. 根据路由目的地的不同,路由可划分为: 网段路由:目的地为网段,IPv4地址子网掩码长度小于32位或 ...

  2. 浅谈HPC中的Lustre

    本文分享自天翼云开发者社区<浅谈HPC中的Lustre>,作者:n****m 1. 什么是 lustre? Lustre 体系结构是一个为集群设计的存储体系结构. 其核心组件是运行在 Li ...

  3. DeepSeek-R1 技术全景解析:从原理到实践的“炼金术配方” ——附多阶段训练流程图与核心误区澄清

    字数:约3200字|预计阅读时间:8分钟 (调试着R1的API接口,看着控制台瀑布般流淌的思维链日志)此刻我仿佛看到AlphaGo的棋谱在代码世界重生--这是属于推理模型的AlphaZero时刻. D ...

  4. 使用MTR网络诊断

    安装 MTR Ubuntu: apt update apt upgrade apt install mtr-tiny CentOS: yum update yum install mtr 使用 MTR ...

  5. Luogu P3041 USACO12JAN Video Game G 题解 [ 紫 ] [ AC 自动机 ] [ 动态规划 ]

    Video Games G:弱智紫题,30min 切了,dp 思路非常板. 多模式串一看肯定就是要建出 AC 自动机,然后在 fail 树里下传标记,预处理每个节点到达后的得分. 然后设计 \(dp_ ...

  6. 初探ASP.NET Core 3.x (2) - ASP.NET Core与ASP.NET前世今生

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/12210662.html 注意 本节是历史课,且绝大多数内容来自于百科或者其他的什么资料来源,如果不感兴趣 ...

  7. 在私有化部署的 Gitlab 实例中开启内置的容器镜像仓库

    版本 极狐 GitLab v16.1.2-jh 步骤 如果使用 Let's Encrpt 集成,容器镜像仓库功能自动开启,访问地址为 your-gitlab-domain:5050. 否则,默认不开启 ...

  8. 大模型工具KTransformer的安装

    技术背景 前面写过几篇关于DeepSeek的文章,里面包含了通过Ollama来加载模型,以及通过llama.cpp来量化模型(实际上Llama.cpp也可以用来加载模型,功能类似于Ollama).这里 ...

  9. JNZ项目犯错记

    年度绩效因为JNZ项目没有达到绩效目标被打了低绩效,这个是我从业这么多年来第一次低绩效,记一下我在这个项目中犯的错误. 项目起源 公司业务是一个ToB的电商场景,已经经营数年了,公司会给大客户一定账期 ...

  10. 【COM3D2Mod 制作教程(5)】实战!制作身体部分(中)

    [COM3D2Mod 制作教程(5)]实战!制作身体部分(中) 帽子是很典型的装扮类型,较为简单适合入门,所以我们先制作帽子 Mod,流程基本和第二章中的概述相符.因为导入插件及其功能位置也都已在第二 ...