vscode远程连接服务器

  • 安装插件Remote - SSH
  • vscode左边工具栏会出现一个“电脑屏幕右下角有><符号”的图标,点进去配置远程主机
  • 编辑config文件,输入以下内容(注意根据实际情况修改)
1
2
3
Host pcl
HostName 192.168.224.xxx
User guofan
  • vscode会询问是否继续,会提示输入密码

配置密钥

  • 在本地使用如下命令生成一个非对称密钥(文件名和描述照实际情况修改):
    ssh-keygen -t rsa -f ~/.ssh/id_rsa -C "PCL"
  • 在本地使用如下命令将公钥拷贝到远程服务器:
    ssh-copy-id -i id_rsa guofan@192.168.224.xxx
  • 终端会提示输入密码,然后尝试使用生成的密钥登陆远程服务器
  • 再次设置vscode的远程服务器,增加密钥路径,最终配置文件为:
1
2
3
4
Host pcl
HostName 192.168.224.xxx
User guofan
IdentityFile /Users/guofan/.ssh/id_rsa

修改远程服务器用户密码

  • 通过ssh连接服务器
  • 执行命令passwd
  • 终端会提示输入旧密码,再输入两次新密码

CMake

  • 安装C/C++插件
  • 安装CMakeCMake Tools插件
  • 安装Doxygen Documentation Generator插件

命令行方式

在某个项目的路径下创建文件CMakeLists.txt,输入以下内容(注意针对性修改,更高级的CMakeLists文件等系统学习了再来写):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 声明要求的cmake最低版本
cmake_minimum_required(VERSION 3.15)

# 声明一个cmake工程
project(assignment1)

# 打印相关消息
MESSAGE(STATUS "my first cmake project")

# 设置路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)

# 设置头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)

# 编译静态库
add_library(graph STATIC ${PROJECT_SOURCE_DIR}/src/graph.cpp)

# 编译可执行文件
add_executable(${PROJECT_NAME} main.cpp)

# 链接需要的库
target_link_libraries(${PROJECT_NAME} graph)

# compile_commands.json中包含所有编译单元执行的指令
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 打包功能
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
  • 创建build文件夹:mkdir build; cd build
  • 执行编译指令:cmake ..; make

build文件夹中即会出现可执行文件。

vscode插件方式

  • 在需要建立 CMake 工程的地方按快捷键F1
  • 会有弹窗提示需要输入工程名、选择 C 还是 C++、选择库或者可执行文件
  • 程序自动在目录下生成build文件夹和CMakeLists.txt文件

自动生成的文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
cmake_minimum_required(VERSION 3.0.0)
project(dag VERSION 0.1.0 LANGUAGES C CXX)

include(CTest)
enable_testing()

add_executable(dag main.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

修改此文件称为符合当前工程的版本,再使用快捷键F7编译,则build文件夹中会出现可执行文件。

CMake 基本使用

参考 Mastering CMake

  • 声明最小 CMake 版本(基本框架):cmake_minimum_required(VERSION x.x)
  • 声明工程名(基本框架):project(xxx)
  • 声明可执行文件(基本框架):add_executable(name xxx.cpp)

使用配置文件

CMakeLists

1
2
3
4
5
6
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
configure_file({
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
"${PROJECT_BINARY_DIR}/TutorialConfig.h"
})

TotorialConfig.h.in

1
2
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

main.cpp

1
2
3
4
5
6
7
8
#include "TutorialConfig.h"
int main (int argc, char *argv[]) {
fprintf(stdout,"%s Version %d.%d\n",
argv[0],
Tutorial_VERSION_MAJOR,
Tutorial_VERSION_MINOR);
return 0;
}

  • 为库创建文件夹,并在文件夹中添加CMakeLists.txt文件,写入编译库的语句:add_library(xxx xxx,cpp)
  • 在顶层的CMakeLists.txt中添加库目录,这样其中的CMakeLists.txt文件就会得以执行:
1
2
include_directories("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory(xxx)
  • 为新加的库添加链接:target_link_libraries(${PROJECT_NAME} xxx)

可选项

  • 在顶层CMakeLists.txt中加入选项:option(USE_MY_LIB "use my optional library?" ON)
  • 修改包含库的部分,让它们受到选项控制使用一个EXTRA_LIBS来收集用到的库:
1
2
3
4
5
if (USE_MY_LIB)
include_directories("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory(xxx)
set(EXTRA_LIBS ${EXTRA_LIBS} xxx)
endif (USE_MY_LIB)
  • 修改链接语句为:target_link_libraries(${PROJECT_NAME} ${EXTRA_LIBS})
  • 在配置文件TotorialConfig.h.in中增加宏定义:#cmakedefine USE_MY_LIB
  • 源代码中检测是否有USE_MY_LIB宏定义就可以决定是否包含头文件:
1
2
3
#ifdef USE_MY_LIB
#include "xxx.h"
#endif

安装与测试

TODO

测试目标平台是否有某函数

1
2
include(CheckFunctionExists.cmake)
check_function_exists(log HAVE_LOG)

同样通过配置文件将这个结果传递给代码:#cmakedefine HAVE_LOG

生成文件及生成器

TODO

安装器

TODO

Dashboard

TODO

Google Test

  • 安装Google Test插件
  • 安装C++ TestMate插件
  • 安装 gtest 库:sudo apt-get install libgtest-dev

集成 CMake

参考 GoogleTest Documentation

CMakeLists.txt中加上如下内容,即可使用 GTest:

1
2
# gtest
target_link_libraries(${PROJECT_NAME} libgtest.a libgtest_main.a pthread)

加入 GTest 的测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TEST(testCase, test0) {
Graph g(6);

g.setEdge({
{0, 1, 5},
{0, 3, 4},
{0, 2, 5},
{1, 3, 1},
{2, 4, 7},
{3, 4, 2},
{3, 5, 7},
{4, 5, 1}
});

EXPECT_EQ(g.findPath(0, 5, {3}).size(), 4);
}

int main(int argc, char ** argv) {
// google test
testing::InitGoogleTest(&argc, argv);

return RUN_ALL_TESTS();
}

运行结果如下:

1
2
3
4
5
6
7
8
9
10
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from testCase
[ RUN ] testCase.test0
[ OK ] testCase.test0 (0 ms)
[----------] 1 test from testCase (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.

Google Test 基本使用

参考官方文档

  • CMakeLists.txttarget_link_libraries(${PROJECT_NAME} libgtest.a libgtest_main.a pthread)
  • C++:#include <gtest/gtest.h>

TODO