Clion单个工程项目中,运行不同main函数 的自动化解决方案

前言

最近正在复习数据结构,使用CLion编写C代码,但是Clion单个工程项目默认只能有一个main函数。这就导致写不同的数据结构时会创建多个工程,觉得这样太繁琐了,比如我学到链表,栈,我要新建一个工程;学到树又要重新建一个工程。太麻烦了。

我的需求

只创建一个工程,在这个工程下有不同的模块(例如:栈,队列,树,图,串......),不同的模块有自己的main()函数,各个能够独立运行互不冲突。类似于IDEA中的 >>>> 子工程。

image-20210926204531654

例如:图中,我的工程项目名为:DataStruct,当我写链表时,就创建一个LinkList模块(文件夹),当我写 串 时,就创建String模块,每个模块下面有自己的 C源码文件,头文件,main函数文件,这些main函数互不冲突。

主要面临的问题

Clion使用的是Cmake,如果要实现不同模块编译生成可执行文件exe,需要配置 CMakeLists.txt

image-20210926205029336
cmake_minimum_required(VERSION 3.20)
project(DataStruct C)

set(CMAKE_C_STANDARD 11)

add_executable(LinkList LinkList/LinkList.c LinkList/LinkListH.h LinkList/LinkListMain.c)
add_executable(aaa aaa/aaa.h aaa/aaaMain.c)
add_executable(String String/myString.c String/mystring.h String/myStringMain.c)

每次只要新增模块,就需要自己手动在 CMakeLists.txt 中添加生成可执行文件的命令。

解决方案

使用Cmake命令自动生成可执行文件,以下代码复制到CMakeLists.txt中。

以下Cmake命令的大概功能就是:

自动扫描当前工程根目录下的所有一级子目录,再分别扫描每一个目录下的全部源文件(我这里只指定了 .c .h两种),然后使用 一级子目录名作为 生成的可执行文件名,然后链接该一级子目录下的所有源文件。自动生成可执行文件。无需自己手动添加。


cmake_minimum_required(VERSION 3.20)
project(DataStruct C)

set(CMAKE_C_STANDARD 11)

# 创建全局目录List
set(dirs_list)
# 递归查找所有后缀名文件 SRC_FILES 变量名
FILE(GLOB_RECURSE SRC_FILES "*.c" "*.h")
FOREACH(FILE_PATH ${SRC_FILES})
    # 获取一级目录名
    string(REGEX REPLACE ".*/.*/(.*)/.*" "\\1" dir ${FILE_PATH})
    # 将所有匹配到的目录名追加到 dirs_list
    list (APPEND dirs_list ${dir})
ENDFOREACH(FILE_PATH)

# 移除dirs_list中的重复目录名,保留第一个出现的
list (REMOVE_DUPLICATES dirs_list)
# 从dirs_list中删除系统 CompilerIdC 目录名
list (REMOVE_ITEM dirs_list CompilerIdC)

# 对每个目录分别 生成可执行文件
foreach(dir ${dirs_list})
    # 创建 文件名list
    set(files_list String/mystring.h String/myString.c)
    # 递归查找 dir目录下的 所有指定后缀名文件 files 变量名
    FILE(GLOB_RECURSE files "${dir}/*.c" "${dir}/*.h")
    foreach (file ${files})
        # 获取源文件名(包括后缀名)
        # string(REGEX REPLACE ".*/\(.*\)" "\\1" exe ${file})

        # 将该目录下的所有源文件都加入到 files_list 中
        list(APPEND files_list ${file})
    endforeach ()
    # 生成dir 目录下的可执行文件, 可执行文件名: dir目录名, 链接改目录下的所有源文件,包括 .h .c
    add_executable(${dir} ${files_list})
endforeach()

示例

image-20210926210925177

当我新增 stack 模块时,Clion会自动生成可执行文件。

image-20210926211528079

需要执行哪个模块的main函数,直接运行对应的可执行文件就行了。

image-20210926211704227


A student who writes the code of Python and Java.