简介
使工程可以应用于不同开发的平台,且可以调用库。
cmake下载地址:
https://cmake.org/download/
本例在vscode进行编译。
工程目录结构介绍
build
该目录存放CMake构建后的缓存文件。
include
该目录存放功能模块头文件。
lib
该目录存放所需的动态库或者静态库。
output
该目录存放编译生成的可执行文件。
src
该目录存放功能模块源码。
doc
该目录存放工程相关说明文档。
source
该目录存放主体业务源码。
testing
该目录存放单元测试源码。
最外层CMakelists示例
cmake_minimum_required(VERSION 3.0.0)
#set the project name and project version
project(myTest VERSION 0.1.0)
# C++标准,使用C++11
set(CMAKE_CXX_STANDARD 11)
#printer information
message("*******************Start Build*************************")
#Release 如果是发行版本就更换Debug为Release
set(CMAKE_BUILD_TYPE "Debug")
if(CMAKE_BUILD_TYPE STREQUAL Debug)
add_definitions(-D_DEBUG) #添加D_DEBUG编译参数
endif()
#设置包含目录,去包含头文件
include_directories(include)
#指定一个子目录src,制定了src,cmake才回去src中找CMakeList
add_subdirectory(src)
add_subdirectory(source)
#项目编译选择,通过选择开关来进行编译选项,通过这种方式去选择编译测试模块中的哪一个
# 之后需要添加,
option(PROJECT_TEST "unit_test" ON) #OFF ON
#添加子工程目录
if(PROJECT_TEST)
add_subdirectory(${CMAKE_SOURCE_DIR}/testing)
endif()
#工程目录下的一级目录原文件,命名为ROOT_SOURCE 用来
#替代方式add_executable(myTest main.cpp hspack.cpp ${HELLO_SRC})
#将当前目录的源文件名赋值给 ROOT_SOURCE
aux_source_directory(. ROOT_SOURCE)
#指定bin文件生成目录
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
#以下为设置可执行文件的生成路径为本文件夹下的output目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/output)
#包含链接库目录
LINK_DIRECTORIES(lib)
#将变量 ${ROOT_SOURCE} ${HELLO_SRC} ${SOURCE_SRC}中的文件编译成执行文件myTest
if(PROJECT_TEST)
add_executable(myTest ${ROOT_SOURCE} ${HELLO_SRC} ${SOURCE_SRC} ${TESTING_SRC})
else()
add_executable(myTest ${ROOT_SOURCE} ${HELLO_SRC} ${SOURCE_SRC})
endif()
#链接库文件,注意链接库文件必须在生成可执行文件之后
target_link_libraries(myTest libhello.dll)
#加载并运行CTest
# note: this adds a BUILD_TESTING which defaults to ON
include(CTest)
#enable_testing() 是启用CMake的测试功能。这个命令告诉CMake在编译过程中生成测试目标,并在构建完成后自动运行这些测试目标。一定要在根目录下的CMakeLists.txt中开启
enable_testing()
#添加测试项文件夹及把测试demo编译成执行文件
if(BUILD_TESTING)
add_subdirectory(unitTest)
add_executable(TestDemo ${UNIT_TEST_SRC})
endif()
# 添加测试
add_test(
test1 TestDemo
COMMAND $<TARGET_FILE:TestDemo>#指代TestDemo这个目标的完整路径
)
#为测试设置属性,设置超时时间为10s
set_tests_properties(test1 PROPERTIES TIMEOUT 10)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
source文件夹层CMakelists示例
#子目录下的源文件,取名为SOURCE_SRC,让父级目录可见
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_SRC)
set(SOURCE_SRC ${SOURCE_SRC} PARENT_SCOPE)
src文件夹层CMakelists示例
#子目录下的源文件,取名为HELLO_SRC,让父级目录可见
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} HELLO_SRC)
set(HELLO_SRC ${HELLO_SRC} PARENT_SCOPE)
test文件夹层CMakelists示例
#子目录下的源文件,取名为TESTING_SRC,让父级目录可见
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} TESTING_SRC)
set(TESTING_SRC ${TESTING_SRC} PARENT_SCOPE)
unitTest文件夹层CMakelists示例
#子目录下的源文件,取名为UNIT_TEST_SRC,让父级目录可见
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} UNIT_TEST_SRC)
set(UNIT_TEST_SRC ${UNIT_TEST_SRC} PARENT_SCOPE)
外部动态库存放示例
src文件代码示例
hello.h
#ifndef HELLO_H
#define Hello_H
void HelloFunc();
#endif
hello.cpp
#include <iostream>
#include "hello.h"
void HelloFunc()
{
std::cout << "Hello World" << std::endl;
}
demo.h
#ifndef DEMO_H
#define DEMO_H
#endif
demo.cpp
#include <iostream>
#include "demo.h"
int main()
{
auto integers={1,2,3,4,5};
std::cout << "this is a demo" << std::endl;
}
main文件代码示例
#include <iostream>
#include "src/hello.h"
#include "source/hspack.h"
#include "include/global.h"
#include "include/myhello.h"
#include "testing/test.h"
#pragma comment(lib, "lib/libhello.lib")
int main(int, char**)
{
std::cout << "Start, Test!\n";
HelloFunc();
int sum = add(1,2);
std::cout << "Sum:" << sum << std::endl;
std::cout << MyString << std::endl;
helloFun();
runTesting();
}
使用VSCODE编译
效果如下
bulid
Run myTest.exe
run cTest
— ->进行单元测试