使用 4 个 C(Clang、CMake、CLion 和 Conan)进行 C++ 编程
这篇文章介绍了如何使用 Clang 作为编译器、CMake 作为构建系统、CLion 作为 IDE 和 Conan 作为包管理器来设置 C 和 C++ 项目的开发环境。 “4 个 C” 这个名字很酷,但不是我的主意,它是由著名的 C++ 博客作者 Arne Metz 提出的,他也是优秀的 Simplify C++ 博客 的作者。
虽然 Clang 在 Windows 上有一些支持,但与 MSVC 相比,其使用率仍然很低,而 Apple-Clang 是 OSX 上的默认编译器,因此它没有特殊的困难。这篇文章将使用 Ubuntu 14.04 作为示例。我们将开发一个使用著名的 POCO 和 Boost 库的简单应用程序。
设置 Clang C/C++ 编译器
Ubuntu 中的默认编译器是 GNU/gcc,因此我们首先需要安装 Clang
$ sudo apt-get install clang-3.6
以这种方式安装,clang 不会自动添加到路径中。确实,设置环境变量 CC 和 CXX 对于大多数用例来说已经足够了。但对于其他情况,例如构建 boost,如果 clang 在路径中,则会简单得多,否则可能需要编辑 .bjam 文件。目前,boost 的 conan 包没有这样做,因此它要求 clang 位于路径中。让我们添加几个链接(很可能我们也可以使用其他方法,如 update-alternatives)
$ sudo ln -s /usr/bin/clang-3.6 /usr/local/bin/clang
$ sudo ln -s /usr/bin/clang++-3.6 /usr/local/bin/clang++
$ clang --version
$ clang++ --version
设置最新的 CMake(元)构建系统
与 Ubuntu 14 捆绑在一起的默认 CMake 版本仍然是 2.8.12,这确实很旧。在撰写本文时,CMake 的当前版本是 3.5,因此让我们安装它。访问 CMake 下载 页面并获取它。在本例中,tar.gz 文件已被检索并安装,将 bin
子文件夹添加到路径的开头,以便它获得更高的优先级。我这样做是因为我必须将 CMake 2.8.12 保留为默认值,但将其永久添加到路径也很容易。
$ export PATH=/home/user/cmake-3.5/bin:$PATH
$ cmake --version
我们将使用 CMake 的“Unix Makefiles”生成器。虽然可以在命令行中将编译器传递给 CMake,但我发现这容易出错,因此我通常更喜欢设置 CC 和 CXX 环境变量。
$ export CC=clang
$ export CXX=clang++
这对于以后使用此编译器的 CLion 也很方便。
设置 Conan C/C++ 包管理器
要在您的计算机上安装 conan,最简单的方法是使用 Python 包
$ sudo pip install conan
如果您全局安装它,可能需要使用 **sudo**,如果使用 virtualenv 则不需要。
设置项目
$ git clone https://github.com/memsharded/four-c-example.git
$ cd four-c-example
在文件夹内有一个简单的 conanfile.txt
文件,定义了我们的依赖项
[requires]
Poco/1.7.2@lasote/stable
Boost/1.60.0@lasote/stable
[generators]
cmake
让我们安装依赖项。我们将使用一个名为 .conan
的临时文件夹(您可以使用任何名称),因为 CLion 编辑器使用外部构建文件夹。为 conan 临时文件使用已知且靠近的文件夹可以方便地管理依赖项
$ mkdir .conan && cd .conan
$ conan install .. -s compiler=clang -s compiler.version=3.6 -s compiler.libcxx=libstdc++ --build=missing
请注意最后的 --build=missing
。Conan 中的大多数包都为主流编译器提供了二进制文件,例如 Win 中的 MSVC、Linux 中的 GNU/gcc 和 OSX 中的 Apple-Clang。因此,预计不会有 Linux 中 Clang 的预编译二进制文件,因此我们必须告诉 conan 从源代码构建它们。去喝杯咖啡吧,它将构建 Poco、Boost 和一些其他库!
此安装步骤将生成 2 个文件:conanbuildinfo.cmake
,其中定义了一些 CMake 变量,例如包含路径和库名称;以及 conaninfo.txt
,其中存储了您的当前配置。如果您愿意,可以并行使用许多配置,只需将每个配置放在单独的文件夹中即可。
您可以使用以下命令检查已安装的依赖项:
$ conan info ..
PROJECT
Requires:
Boost/1.60.0@lasote/stable
Poco/1.7.2@lasote/stable
Boost/1.60.0@lasote/stable
Remote: conan.io=https://server.conan.io
URL: https://github.com/lasote/conan-boost
License: Boost Software License - Version 1.0. https://boost.ac.cn/LICENSE_1_0.txt
Updates: You have the latest version (conan.io)
Required by:
PROJECT
Requires:
zlib/1.2.8@lasote/stable
bzip2/1.0.6@lasote/stable
...
使用 CLion 进行开发
CLion 是 JetBrains 的一个跨平台 C/C++ IDE。让我们使用 CLion 构建我们的应用程序。由于我们已经定义了 CC 和 CXX 环境变量,因此在我们的终端中启动 CLion 将自动使用 Clang 作为默认编译器。
$ cd ..
$ /path/to/clion/bin/clion.sh
如果您转到文件 -> 设置,您会看到编译器是 Clang
也可以使用 CMake 变量 -D CMAKE_C_COMPILER=clang-3.6 -D CMAKE_CXX_COMPILER=clang++-3.6
在 CLion IDE 中定义编译器。请注意,通常需要进行 CMake 缓存清理和重新启动。现在,可以在不重新启动 IDE 的情况下进行此类清理和重新启动,方法是:*菜单 -> 工具 -> CMake -> 重置缓存并重新加载项目*(另一个选项是*菜单 -> 文件 -> 使缓存失效并重新启动*,但由于它会重新启动 IDE,因此速度较慢)。clang 编译器将用于您的构建,但它不会在“设置”对话框中显示为默认值。
从 CLion 的 CMakeLists.txt 项目文件,我们可以加载生成的 conanbuildinfo.cmake
。
cmake_minimum_required(VERSION 2.8)
project(four_c)
include(.conan/conanbuildinfo.cmake)
conan_basic_setup()
add_compile_options(-std=c++11)
add_executable(timer timer.cpp)
target_link_libraries(timer ${CONAN_LIBS})
CLion 将能够从 Poco 和 Boost 头文件中自动完成代码。
就是这样!您现在可以在 CLion 中选择“timer”目标,构建它并运行它!
结论
使用这 4 个工具设置 C++ 开发环境并不复杂。基本上,请确保 Clang 位于路径中,并且 CMake 使用它(通过环境变量 CC 和 CXX)而不是系统 GNU/gcc 编译器。
我还发现,使用定义了这些变量的 CLion 启动更直观,这样它可以检测到 Clang 编译器并在“设置”对话框中显示它。可以在同一个 CLion“设置”对话框中使用 cmake 命令行参数 -DCMAKE_C_COMPILER=clang-3.6 -DCMAKE_CXX_COMPILER=clang++-3.6
,但通常需要进行 CMake 缓存重启,因为 CMake 缓存仅在第一次调用时存储编译器(CLion 会自动执行此操作,然后才能设置命令行参数)。
Conan 包(Poco、Boost 及其依赖项:Zlib、electric-fence……)已使用 Clang 成功构建,但其他一些 conan 包可能尚未使用 Clang 经过彻底测试,最终可能无法构建。在这种情况下,请贡献您的力量,向包存储库提交问题。