AI提示词:通用 vscode linux c++ 项目CMakeLists和bulid模板

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

posted @ 2025-04-19 12:10  码客-ygluu  阅读(39)  评论(0)    收藏  举报