Mac上的C++/CMake开发环境抉择

之前写过一篇文章Visual Studio Code for C++ development on MacOS, 因为在Mac上一直没有找到免费且又比较好用的C++开发工具。但相比起Visual Studio而言,Visual Studio Code还是太简陋了。而今时不同往日了,现在比较倾向于使用CMake来构建项目,所以希望能支持CMake,所以又把各种开发工具尝试了一下。

Eclipse CDT

最近Eclipse-CDT又更新了一下,再次体验了一下,而且根据之前的经验,eclipse是直接支持CMake了的,所以是我的首选目标。

导入CMake工程

Eclipse CDT默认是支持CMake的,所以不用使用cmake生成eclipse的工程,直接就可以用。新建项目的时候是可以直接选用CMake项目的,那么,怎么导入一个现有的CMake工程呢?

实际上,并不能使用"Import"来导入,而是要用"File -> New -> C/C++ Project -> Empty or Existing CMake Project",然后就可以选择现有项目,导入到Eclipse中去了。是不是很坑?

Import project

运行Google Test测试

可以直接在Eclipse中运行Google Test,因为本身编译测试出来是一个应用,其实可以直接运行,但是eclipse集成的Unit Test可以让结果更好看一点:

Run tests

要运行这样的测试必须在Run Configuration中新建一个Unit Test的目标,并选择编译出来的test程序。

Mac下字体设置

Eclipse在Mac下有一个问题就是默认的UI字体实在太小了,看着眼睛疼。

默认字体

有一个解决办法就是安装一个TinkerTool,然后设置“Help tags”字体的大小。参见这个Bug

更改后的字体

缺点

也许Eclipse最大的问题就在于调试了,动不动就卡死在96%上,或者好不容易进去了,却告诉你没有调试信息,要不要看汇编?尝试了很久也没有找到解决办法,除此之外,别的都能接受。但是这个问题很致命啊... 另外一个问题就是,(即使gdb支持的也不好),eclipse是不直接支持lldb的。

Visual Studio Code

看来还是把希望寄托在Visual Studio Code上了。

安装插件

有以下的几个插件需要安装:

  • ms-vscode.cpptools: C/C++插件
  • ms-vscode.cmake-tools: CMake tools
  • webfreak.debug: Native debug插件

安装完成之后,就可以打开CMake工程了。使用Command+Shift+P打开命令窗口,可以看到有很多CMake相关的选项:

  • CMake:Configure 配置支持CMake工程
  • CMake:Clean 清理build
  • ...

也可以通过系统下面的状态栏来设置,设置好之后,一般长这个样子:

Visual Studio Code

可以看到下面的状态栏已经集成了CMake的target。

调试

使用lldb-mi从状态栏启动调试

调试有两种方式:一种是通过状态栏下面的"调试“图标启动的,不需要launch.json,但是默认情况下是不能工作的,需要做如下设置:

新建.vscode/settings.json,将cpptools下面lldb-mi的路径配置进去,比如我的:

{
    "cmake.debugConfig": {
        "miDebuggerPath": "/Users/hfli/.vscode/extensions/ms-vscode.cpptools-0.27.0/debugAdapters/lldb-mi/bin/lldb-mi"
    }
}
lldb-mi

但是这个玩意感觉支持很有限,我调试Googletest测试的的时候就直接挂掉了。

创建launch.json调试

另外一个方式是创建launch.json,这样可以从左边的调试菜单那里开始:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            // Resolved by CMake Tools:
            "program": "${command:cmake.launchTargetPath}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/build",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "MIDebuggerPath": "/Users/hfli/.vscode/extensions/ms-vscode.cpptools-0.27.0/debugAdapters/lldb-mi/bin/lldb-mi",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

但上面照样使用的是lldb-mi,有着跟上面的方法同样的问题。换成gdb后就更是奇怪的到处乱跳了。

使用CodeLLDB插件

另一个选项就是使用CodeLLDB插件,安装完成之后配置launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch debug",
            "type": "lldb",
            "request": "launch",
            "program": "${command:cmake.launchTargetPath}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/build",
            "environment": []
        }
    ]
}

这样终于不会在我调试googletest的时候死掉了,

CodeLLDB

Qt Creator

KDevelop