使用Cmake构建大型C++工程

简介

使工程可以应用于不同开发的平台,且可以调用库。

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
— ->进行单元测试
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个使用CMake构建C++工程的示例。 我们假设这个工程有如下目录结构: ``` . ├── CMakeLists.txt ├── include │ └── mylib.h ├── src │ ├── main.cpp │ └── mylib.cpp └── test ├── CMakeLists.txt └── mylib_test.cpp ``` 其中: - `include` 目录包含头文件 `mylib.h` - `src` 目录包含源文件 `main.cpp` 和 `mylib.cpp` - `test` 目录包含测试代码 `mylib_test.cpp` 下面是 `CMakeLists.txt` 文件的内容: ```cmake # 设置 CMake 最低版本需求 cmake_minimum_required(VERSION 3.10) # 设置项目名称和版本号 project(myproject VERSION 1.0) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) # 添加一个库 target,包含 mylib.cpp 和 mylib.h add_library(mylib src/mylib.cpp include/mylib.h) # 添加一个可执行文件 target,包含 main.cpp,以及 mylib 库 add_executable(myapp src/main.cpp) target_link_libraries(myapp PRIVATE mylib) # 添加一个测试 target,包含 mylib_test.cpp,以及 mylib 库 enable_testing() find_package(GTest REQUIRED) add_executable(mylib_test test/mylib_test.cpp) target_link_libraries(mylib_test PRIVATE mylib GTest::GTest GTest::Main) add_test(NAME mylib_test COMMAND mylib_test) ``` 其中: - `cmake_minimum_required(VERSION 3.10)` 声明了本工程需要 CMake 最低版本 3.10。 - `project(myproject VERSION 1.0)` 声明了本工程的名称和版本号。 - `set(CMAKE_CXX_STANDARD 11)` 设置了 C++ 标准为 C++11。 - `add_library(mylib src/mylib.cpp include/mylib.h)` 添加了一个名为 `mylib` 的库 target,包含 `mylib.cpp` 和 `mylib.h`。 - `add_executable(myapp src/main.cpp)` 添加了一个名为 `myapp` 的可执行文件 target,包含 `main.cpp` 和 `mylib` 库。 - `enable_testing()` 启用了测试功能。 - `find_package(GTest REQUIRED)` 查找 Google Test 库。 - `add_executable(mylib_test test/mylib_test.cpp)` 添加了一个名为 `mylib_test` 的测试 target,包含 `mylib_test.cpp` 和 `mylib` 库。 - `target_link_libraries(mylib_test PRIVATE mylib GTest::GTest GTest::Main)` 将 `mylib` 和 `GTest` 库链接到 `mylib_test` 中。 - `add_test(NAME mylib_test COMMAND mylib_test)` 添加了一个名为 `mylib_test` 的测试。 现在你可以使用以下命令构建和运行工程: ```bash mkdir build cd build cmake .. make ./myapp ctest ``` `make` 命令将编译所有 target,并生成可执行文件和库文件。`./myapp` 命令将运行 `myapp` 可执行文件。`ctest` 命令将运行所有测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值