最近打算阅读一些C/C++的开源项目源码来提升自己,不过开源项目大多使用Makefile构建和管理。关于阅读代码,我之前在Windows下用过 Source Insight ,它的符号调转、查找、导航非常强大,体验很好,但Mac平台一直没找到那么好用的代码浏览工具,Sublime Text + CTags 勉强能用,但仍然算不上强大。另外,单纯的读代码是一件枯燥的事,我们往往需要运行、打断点、修改代码来帮助理解,这方面 Source Insight 和 Sublime Text + CTags 也不如 IDE 来的方便。
Xcode是Mac平台的钦定的 IDE 了,Xcode 使用 xcodeproj 文件来管理工程。Makefile 无法直接转换成 xcodeproj ,但 Xcode 支持外部构建系统(External Build System)作为 Target,直接使用 Makefile 进行构建,这种方式下我们可以 ⌘ + R
一键运行程序,也可以很方便地使用 Xcode 的图形界面设置断点调试代码,但通常情况下使用 External Build System 的 Target 并不支持符号跳转和自动补全,这非常不便于我们对代码的阅读和修改。不过好消息是,我们可以通过一些小技巧让项目同时支持调试运行、符号跳转以及自动补全。使用这篇文章使用开源的 Key-Value 数据库 Redis 来作为例子,演示将 Redis 导入到 Xcode 中的步骤。
假设我存储 Redis 仓库的本地路径是 ~/Developer/Read/
cd ~/Developer/Read
git clone https://github.com/antirez/redis.git
我当前的Xcode版本是8.3.3,在创建项目窗口的 Cross-platform/Other 下选择 External Build System。
点击 Next,接下来项目信息 Product Name 可以填 xcode_redis
,其他选项保持默认。
点击Next,然后选择项目存放的位置,建议选择 redis 本地仓库的上一级(即本文中的 ~/Developer/Read/
),最后点击 Create 完成项目的创建。
项目创建完毕默认选中了工程的配置文件,按照图中的顺序依次点击 xcode_redis 工程文件/TARGETS/xcode_redis/info ,在 Directory 中填入 ../redis
。
使用 ⌘ + B
构建工程,如果构建失败,可以尝试在终端使用以下命令来安装命令行工具,再重新构建。
xcode-select --install
如果构建成功,我们需要设置可执行文件的路径。点击顶部菜单 Product/Scheme/Edit Scheme… 在弹出的Scheme窗口中选择 Run/Info,将 Executable 从 None 改为 Other…
在弹出的文件选择对话框中选择刚刚构建出来的服务器端可执行文件,路径为 ~/Developer/Read/redis/src/redis-server
。
现在工程已经可以运行了,按下 ⌘ + R
可以看到控制台的输出。
为了可以断点调试以及阅读,接下来我们需要给这个工程添加文件,在左侧导航栏右键选择 Add Files to “xcode_redis”…,弹出文件选择对话框,点击 options 按钮,然后按照下图取消 Destination: Copy items if needed 的勾选,并确保 Added folders: Create groups 和 Add to targets: xcode_redis 是选中状态,然后选中 Redis 仓库的根目录 ~/Developer/Read/
点击 Add。
现在我们已经可以直接使用 Xcode 给代码添加断点了。下图我们在 server.c
文件的 main 函数中点击代码左侧来添加断点,按下 ⌘ + R
程序自动停在断点处。
此时虽然代码已经可以高亮关键字,但我们仍然无法使用代码跳转和自动补全功能。这些功能就需要下一步的 Dummy Target 辅助完成。
点击顶部菜单 Editor/Add Target… 弹出新建 Target 窗口,在 macOS/Application 下选择 Command Line Tool,点击 Next。
接下来 Target 信息 Product Name 可以填 dummy
,其他选项保持默认,点击 Finish。
Dummy Target 添加完毕默认选中了工程的配置文件,按照图中的顺序依次点击 xcode_redis 工程文件/TARGETS/dummy/Build Phases/Compile Sources/+
在弹出的添加编译源窗口过滤器中输入 *.c
,然后任意点击一个过滤后的文件,按下 ⌘ + A
全选,最后点击 Add 按钮,实现了批量的编译源文件的添加。
Redis 是 C 项目,如果项目是 C++,这一步的过滤器输入应该输入 *.cpp
或者 *.cc
。
完成了编译源的添加,现在 Xcode 已经可以进行符号跳转和自动补全了,可以欢快地阅读了~
注:如果到了这一步,符号跳转和自动补全仍然不起作用,可以将当前 Target 切换为 dummy,按下 ⌘ + B
进行一次构建,强制 Xcode 建立符号索引。在 dummy 中进行构建可能会报错,不过我们只是为了使用 dummy 下的索引,并不需要真正构建,所以错误直接无视即可,构建完毕再将当前 Target 切换回 xcode_redis。