CMake项目生成脚本

 手动写Makefile太麻烦,然后选择CMake,但是用CMake还是要写CMakeList.txt,于是自己写了个shell脚本来实现快速创建CMake项目。
 

#!/bin/sh
#-------------
# Module : mk_cmake_pro.sh
# Author : Shunli Guo
# Created : 2018.6.12
# Modify :
# Version : 1.0
# Usage : ./mk_cmake_pro.sh
# Description : 创建一个cmake的工程
#---------------
# 默认情况下运行本程序,会生成如下目录和文件
# test
# ├── build
# ├── CMakeLists.txt
# ├── config.json
# ├── include
# ├── lib
# ├── test
# │   └── main.cc
# └── version.h.in
#
# 4 directories, 4 files
#
# 其中:
# 1. CMakeLists.txt是CMake的描述文件
# 2. build是编译目录
# 3. config.json是配置文件
# 4. include文件夹是头文件搜索路径
# 5. lib文件夹是库文件搜索路径
# 6. main.cc是主程序
#
# 编译操作过程:
# cd build 
# cmake ..
# make
# 使用make生成exe输出在test文件夹中
# make install
# 将配置文件等其他相关文件拷贝到test文件夹中
# make clean

PWD=$(pwd)
cd $PWD

if [[ "$1" = "" ]]; then
echo "Usage: ./mk_cmake_pro.sh project_name"
echo -ne "Please input the Project Name like [test] !"
read Answer
if [[ "$Answer" = "" ]]; then
echo -e "test";
PRO_NAME=test;
else
	PRO_NAME=$Answer;
fi
else
	PRO_NAME=$1;
fi

if [[ "$2" = "" ]]; then
echo "Usage: ./mk_cmake_pro.sh project_name exe_name"
echo -ne "Please input the exe name like [test] !"
read Exename
if [[ "$Exename" = "" ]]; then
echo -e "test";
EXE_NAME=test;
else
	EXE_NAME=$Exename;
fi
else
	EXE_NAME=$2;
fi

#创建目录
echo "-------------Init Directory ...-------------"
mkdir -p $PRO_NAME/build
mkdir -p $PRO_NAME/include
mkdir -p $PRO_NAME/lib
#mkdir -p $PRO_NAME/${EXE_NAME}

#创建CMakeLists.txt
echo "-------------Create CMakeLists.txt-------------"
cd $PRO_NAME

echo "cmake_minimum_required (VERSION 2.8)

PROJECT($PRO_NAME)

#ADD_SUBDIRECTORY($EXE_NAME obj)

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG(\"-std=c++11\" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG(\"-std=c++0x\" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
        SET(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=c++11\")
elseif(COMPILER_SUPPORTS_CXX0X)
        SET(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=c++0x\")
else()
     message(STATUS \"The compiler \${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.\")
endif()

# The version number.
set (VERSION_MAJOR 0)
set (VERSION_MINOR 0)
set (VERSION_PATCH 0)
set (VERSION_BUILD 1)

# configure a header file to pass some of the CMake settings to the source code
configure_file (
    \"\${PROJECT_SOURCE_DIR}/version.h.in\"
    \"\${PROJECT_BINARY_DIR}/version.h\"
)

SET(CMAKE_INSTALL_PREFIX \${PROJECT_BINARY_DIR})
install(FILES \${PROJECT_SOURCE_DIR}/config.json \${PROJECT_SOURCE_DIR}/${EXE_NAME}d DESTINATION \${PROJECT_BINARY_DIR}/bin)


#添加${EXE_NAME}的项目构建信息

#添加当前目录CPP文件
AUX_SOURCE_DIRECTORY(\${PROJECT_SOURCE_DIR} EXE_SRC_LIST)

#添加 include 搜索路径
INCLUDE_DIRECTORIES(\${PROJECT_SOURCE_DIR}
					\${PROJECT_SOURCE_DIR}/include)

#添加version的搜索路径
INCLUDE_DIRECTORIES(\${PROJECT_BINARY_DIR})

#添加 lib 搜索路径
LINK_DIRECTORIES(\${PROJECT_SOURCE_DIR}/lib
					/usr/local/lib)

#设置目标文件生成目录
set(EXECUTABLE_OUTPUT_PATH \${PROJECT_BINARY_DIR}/bin)

#目标文件名
ADD_EXECUTABLE(${EXE_NAME} \${EXE_SRC_LIST})

#链接lib库
#TARGET_LINK_LIBRARIES(play \${PROJECT_SOURCE_DIR}/lib/srs_librtmp.a)  # 显示指定链接静态库
#TARGET_LINK_LIBRARIES(${EXE_NAME})
" > CMakeLists.txt

#创建version.h.in
echo "-------------Create version.h.in-------------"

echo "#define VERSION_MAJOR @VERSION_MAJOR@
#define VERSION_MINOR @VERSION_MINOR@
#define VERSION_PATCH @VERSION_PATCH@
#define VERSION_BUILD @VERSION_BUILD@
" > version.h.in

#创建 config.json
echo "-------------Create config.json-------------"

echo "{
    \"name\":\"${EXE_NAME}\"
}" > config.json

echo "Create ${EXE_NAME}d"

echo "#!/bin/bash
# @Author:  ifree2017
# @Date:    `date "+%Y-%m-%d %H:%M:%S"`
# @Last Modified by:    ifree2017
# @Last Modified time:  `date "+%Y-%m-%d %H:%M:%S"`
# @processname: /etc/init.d/${EXE_NAME}d

# Source function library.
. /etc/init.d/functions

if [ \$2 == \"-d\" ] ; then
    EXEC_PATH=\`pwd\`
else
    EXEC_PATH=/usr/local/${EXE_NAME}
fi

EXEC=${EXE_NAME}
PID_FILE=/var/run/\${EXEC}.pid
DAEMON=\${EXEC_PATH}/\${EXEC}

if ! [ -x \${EXEC_PATH}/\${EXEC} ] ; then
    echo \"ERROR: \${EXEC_PATH}/\${EXEC} not found\"
    exit 1
fi

if ! [ -x \${EXEC_PATH}/log ] ; then
    echo \"mkdir log\"
    mkdir -p \${EXEC_PATH}/log
fi

logfilename=\"\${EXEC_PATH}/log/\${EXEC}_info_\`date +%Y%m%d_%H%M%S\`.log\"
stop()
{
        echo \"Stoping \${EXEC} ...\"
        killall \${DAEMON} >/dev/null
        usleep 100
        echo \"Shutting down \${EXEC}: [ OK ]\"
}

start()
{
        echo \"Starting \${EXEC} ...\"
        nohup \${DAEMON} 2>&1 >> \${logfilename} 2>&1 /dev/null &
        echo \"Starting \${EXEC}: [ OK ]\"
        usleep 100
}

restart()
{
        stop
        start
}
case \$1 in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                start
        ;;
        status)
                ps aux|grep ${EXEC}
        ;;
        *)
                echo \"Usage: service \${EXEC} {start|stop|restart|status}\"
                exit 1
        ;;
esac

exit \$?" > ${EXE_NAME}d

chmod a+x ${EXE_NAME}d

#cd $EXE_NAME

#创建main.cc
echo "Create main.cc"

echo  "#include \"version.h\"
#include <stdio.h>

int main(int argc, char const *argv[])
{
	/* code */
	printf(\"Hello ${EXE_NAME}!\r\n\");
	printf(\"version:%d.%d.%d.%d!\r\n\", VERSION_MAJOR, VERSION_MINOR,
         VERSION_PATCH, VERSION_BUILD);
	return 0;
}
" >  main.cc

echo "-------------All Done!-------------"

 脚本如下,使用时执行

./mk_cmake_pro.sh testpro test

创建成功后
 

cd testpro/build

cmake ..

make

make install

cd bin

./test 或者 ./testd start|stop|restart -d

Over!

 

<think>我们正在处理一个关于使用CMake生成Visual Studio工程脚本的查询。根据用户的问题和提供的引用,我们需要提供一个清晰的步骤指南,并可能包含一个示例CMakeLists.txt文件。 关键点: 1. 用户需要知道如何编写CMake脚本生成Visual Studio工程。 2. 引用中提到了使用CMake GUI和命令行两种方式,但用户特别要求脚本(script),因此我们将重点放在CMakeLists.txt文件的编写上。 3. 引用中提供了一些CMakeLists.txt的示例片段。 步骤: 1. 创建一个CMakeLists.txt文件,该文件描述了项目结构和构建要求。 2. 使用cmake命令行工具或CMake GUI来生成Visual Studio工程。 我们将提供一个简单的示例,包括: - 指定CMake最低版本 - 定义项目名称 - 添加可执行文件(或库) - 可选:指定C++标准等 同时,我们也会简要说明如何使用命令行或GUI来生成工程。 注意:用户可能希望生成不同版本的Visual Studio工程,因此我们可以在命令行中指定生成器(Generator)或通过GUI选择。 根据引用[4]的示例,我们可以构建一个基本的CMakeLists.txt。 示例CMakeLists.txt: ``` cmake_minimum_required(VERSION 3.12) project(MyProject) # 设置C++标准(可选) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 添加源代码文件 add_executable(MyProject main.cpp) ``` 生成步骤(命令行): 1. 打开命令提示符(或CMake提供的命令行工具)。 2. 进入项目目录(包含CMakeLists.txt的目录)。 3. 创建一个构建目录(例如build)并进入。 4. 运行cmake命令,指定生成器为Visual Studio,例如: ``` cmake -G "Visual Studio 16 2019" .. ``` 这里"Visual Studio 16 2019"对应VS2019,用户可以根据需要选择其他版本。 生成步骤(GUI): 1. 打开CMake GUI。 2. 设置源代码路径(即包含CMakeLists.txt的目录)和构建路径(建议在项目目录下新建一个build目录)。 3. 点击“Configure”,选择生成器(Visual Studio版本和平台),然后点击“Finish”。 4. 配置完成后,点击“Generate”生成工程文件。 注意:在生成过程中,CMake会根据CMakeLists.txt中的指令生成对应的Visual Studio解决方案(.sln)和项目文件。 相关问题: 根据用户的问题,我们可以生成一些相关问题,以帮助用户深入理解。 现在,我们将按照上述思路组织回答。</think>### 使用CMake生成Visual Studio工程脚本方法 以下是使用CMake生成Visual Studio工程的标准脚本方法和步骤,基于您提供的引用信息整理: #### 1. **基础CMake脚本示例** 在项目根目录创建`CMakeLists.txt`文件,内容如下: ```cmake cmake_minimum_required(VERSION 3.20) # 指定CMake最低版本 project(MyProject) # 定义工程名称(与.sln同名) # 添加可执行文件(生成MyProject.exe) add_executable(MyProject main.cpp # 主代码文件 utils.cpp # 其他源文件 include/utils.h # 头文件 ) # 可选:设置C++标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` > 注:`add_executable`的第一个参数`MyProject`将作为VS工程名和输出exe名称[^4]。 #### 2. **生成Visual Studio工程的两种方式** **▸ 命令行生成(推荐)** ```bash # 在项目根目录执行: mkdir build cd build cmake .. -G "Visual Studio 17 2022" -A x64 # 指定VS版本和平台 ``` > 常用生成器参数: > - `-G "Visual Studio 17 2022"` → VS2022 > - `-G "Visual Studio 16 2019"` → VS2019 > - `-A Win32` 或 `-A x64` → 指定架构[^1] **▸ CMake GUI生成** 1. 打开`cmake-gui.exe` 2. 设置路径: - **Where is the source code**: 项目根目录(含CMakeLists.txt) - **Where to build the binaries**: 项目根目录`/build`(自动创建) 3. 点击`Configure` → 选择VS版本和平台 → `Finish` 4. 红色错误消失后点击`Generate`[^2][^3] #### 3. **打开生成工程** 在`build/`目录下会生成: - `MyProject.sln` → Visual Studio解决方案文件 - `.vcxproj`文件 → 项目文件 双击`.sln`即可在Visual Studio中打开工程[^2]。 #### 4. **关键注意事项** 1. **路径规范**: - 避免中文路径(可能导致生成失败)[^2] - 头文件目录需通过`include_directories(include)`显式指定 2. **版本兼容**: - CMake版本需≥脚本中`cmake_minimum_required`声明的版本 - 使用`cmake --version`检查CMake版本[^2] 3. **多配置支持**: - 生成后可在VS中切换Debug/Release模式 - 通过`-DCMAKE_BUILD_TYPE=Release`指定默认配置 #### 5. **完整项目结构示例 ``` MyProject/ ├── CMakeLists.txt # CMake脚本 ├── include/ │ └── utils.h # 头文件 ├── src/ │ ├── main.cpp # 主程序 │ └── utils.cpp # 实现文件 └── build/ # 生成目录(由CMake创建) └── MyProject.sln # VS解决方案 ``` > 提示:对于Qt项目,需在`CMakeLists.txt`中添加`find_package(Qt6 REQUIRED COMPONENTS Core Widgets)`并链接`Qt6::Widgets`[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值