1、我们先来看下面的一个项目的结构
TestGroup工程下面的main.cpp同级的有两个文件夹,到时候我们想在IDE比如xcode或者visual stdio2019中也显示这样的结构怎么弄呢(答案是用cmake中的source_group函数)
2、假如没有用source_group生成的xcode工程是怎么样的,看下面的CMakeLists.txt文件
- cmake_minimum_required(VERSION 3.6)
-
- set(APP_NAME "cc_app")
-
- project(${APP_NAME})
-
- file(GLOB CC_SOURCES
- ${CMAKE_CURRENT_LIST_DIR}/*.cpp
- ${CMAKE_CURRENT_LIST_DIR}/*.h
- ${CMAKE_CURRENT_LIST_DIR}/log/*.cpp
- ${CMAKE_CURRENT_LIST_DIR}/log/*.h
- ${CMAKE_CURRENT_LIST_DIR}/common/*.cpp
- ${CMAKE_CURRENT_LIST_DIR}/common/*.h
- )
- include_directories(${CMAKE_CURRENT_LIST_DIR}/log)
- include_directories(${CMAKE_CURRENT_LIST_DIR}/common)
- add_executable(${APP_NAME} ${CC_SOURCES})
利用cmake -G"Xcode" ..
生成的xcode工程目录为
发现这个工程没有了log目录跟common目录
3、通过用cmake中的source_group函数来解决就好了,我们添加一个宏
- cmake_minimum_required(VERSION 3.6)
-
- # 添加source_group函数宏,用户建立目录结构
- macro(source_group_by_dir source_files)
- set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR}/)
- foreach(sgbd_file ${${source_files}})
- string(REGEX REPLACE ${sgbd_cur_dir} "" sgbd_fpath ${sgbd_file})
- string(REGEX REPLACE "[^/\\\\]+$" "" sgbd_group_name ${sgbd_fpath})
- if(sgbd_group_name)
- string(REPLACE "/" "\\\\" sgbd_group_name_normal ${sgbd_group_name})
- source_group(${sgbd_group_name_normal} FILES ${sgbd_file})
- endif(sgbd_group_name)
- endforeach(sgbd_file)
- endmacro(source_group_by_dir)
-
- set(APP_NAME "cc_app")
-
- project(${APP_NAME})
-
- file(GLOB CC_SOURCES
- ${CMAKE_CURRENT_LIST_DIR}/*.cpp
- ${CMAKE_CURRENT_LIST_DIR}/*.h
- ${CMAKE_CURRENT_LIST_DIR}/log/*.cpp
- ${CMAKE_CURRENT_LIST_DIR}/log/*.h
- ${CMAKE_CURRENT_LIST_DIR}/common/*.cpp
- ${CMAKE_CURRENT_LIST_DIR}/common/*.h
- )
- #对文件目录进行组织
- source_group_by_dir(CC_SOURCES)
- include_directories(${CMAKE_CURRENT_LIST_DIR}/log)
- include_directories(${CMAKE_CURRENT_LIST_DIR}/common)
- add_executable(${APP_NAME} ${CC_SOURCES})
最终xcode项目的结构就成了
这样的话就让项目目录的组织就更加整齐合理了。