在Xcode中设置一个C / C ++ makefile项目:语法高亮,自动完成,跳转到定义等等!

在这篇文章中,我将向您展示如何设置Xcode,以便您可以在C / C ++项目中使用它。 它将允许您使用IDE提供的所有出色功能。 在撰写本文时,我正在使用Xcode 9.2和MacOS High Sierra。 我将以crazyflie 2.0固件项目为例。 它具有一个使用makefiles作为构建系统的C代码库。

第一步:获得构建项目的工具

在这种情况下,crazyflie项目需要用于Arm的GNU嵌入式工具链。 他们提供了许多安装选择(虚拟机,docker,从源代码构建,从ARM下载预编译的二进制文件),但是我发现的最简单的方法是使用此brew公式,该公式从ARM获取最后一个预编译的二进制文件并对其进行配置,因此您唯一需要做的是:

$ brew tap osx-cross/arm 
$ brew install arm-gcc-bin

之后,您可以通过检查版本来验证正确的安装:

  $ arm-none-eabi-gcc --version 
arm-none-eabi-gcc(用于Arm嵌入式处理器的GNU工具7-2017-q4-major)7.2.1 20170904(发行版)[ARM / embedded-7-branch版本255204]
版权所有(C)2017自由软件基金会,Inc.
这是免费软件; 请参阅复制条件的来源。 没有保修; 甚至不是出于适销性或针对特定目的的适用性。

第二步:获取项目的源代码

在这种情况下,请获取crazyflie固件的源代码。 因为此特定项目使用git子模块,所以我们还需要传递--recursive参数:

  git clone-递归https://github.com/bitcraze/crazyflie-firmware.git 

之后,该项目将位于名为crazyflie-firmware的文件夹下。

第三步:设置要构建的Xcode项目

首先,通过执行以下操作创建一个新的Xcode项目:

 文件->新建->项目 

cross-platform选项卡下,使用External Build System模板。 给它起个名字并完成设置:

然后,转到主要目标的info选项卡,并将“ Directory字段更改为包含crazyflie源代码的目录: crazyflie-firmware 。 还建议传递-j参数以启用多核构建(更快!):在我的情况下,我有2个核,因此我传递-j2参数。 结果是:

此时,如果您从Xcode运行项目,则可以成功构建它! 😂

第四步:获得所有那些甜蜜的甜蜜编辑器功能

目前,我们有一个可以构建的空项目,但是我们尚未添加源代码。 现在,我们将创建一个新的目标,该目标将强制Xcode对源代码进行索引,从而允许我们使用所有编辑器功能:

 文件->新建->目标 

macOS选项卡下,使用Command Line Tool模板。 给它起个名字,设置语言并完成设置:

Xcode在项目中自动创建了两个文件夹,并创建了一个新方案:您可以删除所有文件夹。

现在,我们将把源代码文件夹crazyflie-firmware拖到Xcode项目中:

Xcode将提示您输入一些信息。 确保取消标记“ Create external build system project选项:

在下一个屏幕的“ Add to targets部分下,确保标记先前创建的目标(在我的情况下,我将其称为xcode ):

完成此操作后,您将看到您的代码出现在项目中,并且Xcode正在对其进行索引。 现在,您可以从所有编辑器功能中受益,例如语法突出显示,自动完成,跳转到定义,错误在其行旁边的Xcode中显示,快速跳转到包含错误的行,智能搜索和替换,重构工具等等。 ! 🎉

您可以在github中找到带有crazyflie源代码的xcode项目示例。

奖励步骤:添加目标,以便我们可以执行其他操作

您的项目可能包含其他makefile目标。 在这种情况下,crazyflie项目有一个将固件安装在无人机中的项目:

 使cload 

我们可以从Xcode内部执行命令,而无需打开终端。 让我们创建一个新目标:

 文件->新建->目标 

cross-platform选项卡下,使用External Build System模板。 给它起个名字并完成设置:

然后,转到此新创建的目标的info选项卡,并将“ Directory字段更改为包含crazyflie源代码的目录: crazyflie-firmware 。 另外,将Arguments字段更改为要执行的makefile目标,在本例中为cload

最后,转到“ Build Phases选项卡,然后在“ Target Dependencies项”下添加crazyflie目标。 在尝试将其安装到无人机之前,这将确保已构建代码并存在固件:

现在,您可以运行cload目标,并查看如何在无人机中构建和安装代码! 🤘