在 MacOS 上使用 CLion+Boost 简易教程

最近要用 C 写一个比较大的项目,里面有非常多的模块,而且不容易整个项目一起跑,于是准备使用 CLion + Boost 来进行单元测试,搭建环境花了挺久的,记一下吧!

一、选型

CLion说它支持 BoostTest ,支持GoogleTest ,支持CatchFramework 。这里我代码是用 c 写的,查了一下好像说用 BoostTest 最方便,也没多想,就用了 Boost,可能另外两个也不错吧!

二、安装 Boost

不废话,一句就可以了

1
brew install boost

具体装到哪,好像就是最常见的那个地方,可能因为使用 brew 的人太多了,导致当今的 CMake 都会默认从那里面寻找组件,所以这里可以认为是装好了。

三、在 CLion 中使用

1
2
3
4
5
6
7
8
9
因为我不大会 boost 的语法,所以只能给一些简单的案例,先修改 CMake。

cmake_minimum_required(VERSION 3.13)

project(boost_wrapper CXX)
add_executable(boost_wrapper boost_wrapper.cpp)

find_package(Boost REQUIRED COMPONENTS unit_test_framework)
include_directories(${Boost_INCLUDE_DIR})

注意第三行,这里一定要将单元测试编译为可执行文件,因为boost的设计似乎不是去加载 library(static 和 shared 都是不可以的),而是执行可执行程序,因为会出这个报错。

1
11:44Error running 'nothing': Cannot run program "/Users/leadroyal/CLion_code/boost_demo/cmake-build-debug/libboost_wrapper.a" (in directory "/Users/leadroyal/CLion_code/boost_demo/cmake-build-debug"): error=13, Permission denied

这里写一个简单的 cpp 代码,需要注意的一点是,boost 提供的 API本身是针对 cpp 写的,所以一定要用 boost_wrapper.cpp 不能用 boost_wrapper.c ,不然宏定义会挂,无法编译通过。而又会有一个问题,cpp 里的函数声明和 c 里的函数声明有不一致的地方,可能差几个字节或者下划线,所以如果 cpp 去包含 c 的头文件,一定要处理好,加上 extern "C" 的标记,这里只有单个文件,所以没关系。

1
2
3
4
5
6
7
8
9
10
11
//
// Created by LeadroyaL on 2019-02-02.
//

#define BOOST_TEST_MODULE nothing

#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_CASE(nothing){
BOOST_TEST(true /* test assertion */ );
}

之后在 BOOST_AUTO_TEST_CASE 左边会出现一个绿绿的剪头,点击就可以让 CLion 帮我们测试了。 整个目录结构是:

1
2
3
4
5
6
7
8
➜  boost_demo lsa
total 16
drwxr-xr-x 6 leadroyal staff 192B Feb 2 13:19 .
drwxr-xr-x 12 leadroyal staff 384B Feb 2 10:48 ..
drwxr-xr-x 8 leadroyal staff 256B Feb 2 13:23 .idea
-rw-r--r-- 1 leadroyal staff 217B Feb 2 13:19 CMakeLists.txt
-rw-r--r-- 1 leadroyal staff 203B Feb 2 11:32 boost_wrapper.cpp
drwxr-xr-x 12 leadroyal staff 384B Feb 2 13:23 cmake-build-debug

四、效果

非常友好!

五、其他 tips

编译链接时候会很卡,因为链接出来的东西可能比较大吧,耐心一点。