一、没有CMake文件
目录结构:
建一个工程目录,目录结构如下:
.
├── mytest
├── mytest.cpp
├── mytest.exe
└── .vscode
├── c_cpp_properties.json
├── extensions.json
├── launch.json
├── settings.json
└── tasks.json
c_cpp_properties.json:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
// "compileCommands": "${workspaceFolder}/compile_commands.json",
// "configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug C/C++",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}],
"preLaunchTask": "build & debug file"
}
]
}
task.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build & debug file",
"type": "shell",
"command": "g++",
"args": [
"-g",
"-o",
"${fileBasenameNoExtension}",
"${file}"
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$gcc"
}
]
}
mytest.cpp
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string>
#include<time.h>
using namespace std;
#define NUM 10000000000
long long fun(long long n)
{
long long t =1;
for(int i=1; i<=n; i++)
{
t = t * n ;
if(t > NUM)
t = t % NUM;
}
return t;
}
int main(int argc, const char **argv )
{
int maxNum = 1000;
long long ret=0;
for(int i=1;i<=maxNum;i++)
{
if(i % 10 == 0)
continue;
ret += fun(i);
if(ret> NUM)
ret = ret % NUM;
}
cout << "(1^1+2^2+...+1000^1000) %1000000000 = "<< ret<<endl;
return 0;
}
设置好后进行调试即可。
二、简单CMake
目录结构:
建一个工程目录,目录结构如下
.
├── build
├── CMakeLists.txt
├── code
│ ├── inc
│ └── src
└── .vscode
├── c_cpp_properties.json
├── extensions.json
├── launch.json
├── settings.json
└── tasks.json
c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
// "compileCommands": "${workspaceFolder}/compile_commands.json",
// "configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug C/C++",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/last",
// "program": "${workspaceFolder}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}],
"preLaunchTask": "Build"
}
]
}
task.json
{
"version":"2.0.0",
"options":
{
"cwd": "${workspaceFolder}/build" // 调用该task.json 任务时,首先进入到 build目录下
},
"tasks": [
{
"type": "shell",
"label": "cmake", // 构造 "cmake .. " 命令
"command":"cmake",
"args": [
".."
]
},
{
"type": "shell",
"label": "make", // 使用make命令来编译,当前window下使用到了mingw64 下的mingw32-make.exe 来触发
"group": {
"kind": "build",
"isDefault": true
},
"command":"make"
// "command":"mingw32-make.exe"
},
{
"label": "Build", // launch.json 文件中调用的 "preLaunchTask": "Build",会调用到此Task
"dependsOn":[ // 该task下依赖其他两个任务 cmake 、make 任务
"cmake",
"make"
]
}
]
}
inc下文件swap.h:
#ifndef _SWAP_H_
#define _SWAP_H_
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
#endif
src文件main.cpp
#include <iostream>
#include "swap.h"
using namespace std;
int main(int argc, const char *argv[])
{
int a = 10;
int b = 20;
cout <<"Before:" << a << ","<< b << endl;
swap(a, b);
cout <<"After:" << a << ","<< b << endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.11)
project(MY_CMAKE)
set(CMAKE_CXX_STANDARD 14)
# 显示指定使用的C++编译器
set(CMAKE_CXX_COMPILER "g++")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
# add_executable(mycmake mycmake.cpp)
#Bring the headers, such as Student.h into the project
include_directories(code/inc)
#Can manually add the sources using the set command as follows:
# set(SOURCES code/src/mycmake.cpp code/src/mycmake.cpp)
#However, the file(GLOB...) allows for wildcard additions:
file(GLOB SOURCES "code/src/*.cpp")
# 指定生成目标
add_executable(last ${SOURCES})
构建工程即可编译
三、VSCode+CMake+gtest
下载gooletest,解压,进入目录,新建build,进入build新建gtest,执行cmake ..和make,退到build目录,再执行cmake..和make
建立工程:
创建一个工程目录,目录结构如下:
.
├── build
├── CMakeLists.txt
├── googletest-release-1.8.1
│ ├── appveyor.yml
│ ├── build
│ ├── BUILD.bazel
│ ├── ci
│ ├── CMakeLists.txt
│ ├── configure.ac
│ ├── CONTRIBUTING.md
│ ├── .gitignore
│ ├── googlemock
│ ├── googletest
│ ├── LICENSE
│ ├── Makefile.am
│ ├── README.md
│ ├── .travis.yml
│ └── WORKSPACE
├── googletest-release-1.8.1.zip
├── main.cpp
└── test.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(basic_test)
################################
# GTest
################################
ADD_SUBDIRECTORY (googletest-release-1.8.1)
enable_testing()
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
################################
# Unit Tests
################################
# Add test cpp file
add_executable( runUnitTests test.cpp main.cpp)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests gtest gtest_main)
add_test( runUnitTests runUnitTests )
main函数:
#include "gtest/gtest.h"
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
test.cpp
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
进入build目录,执行
cmake ..
make
生成执行文件