入门:构建并运行第一个示例
本教程演示如何在本地构建 libcc 并运行一个最小示例:创建一个异步事件管理器,注册一个 1 秒后触发的计时器,触发后打印日志并退出。
先决条件
- macOS(或 Linux),命令行工具(Xcode Command Line Tools)查看:Build tools提供详细说明方法
- 已安装
git、make和常见编译工具链 - 仓库已 clone 到本地(见下方“构建并安装”)
构建并运行
步骤概述: 先构建 libcc(使用仓库已有脚本):
git clone https://github.com/libcc/libcc.git
cd libcc
#make .so debug //直接编译
# 使用仓库自带构建脚本(会构建动态库)
cd build
./build.sh debug
构建完成后
若你希望,把示例加入到仓库的 tests/ 并使其可直接通过 make .bin target=tests build=C文件源码.c 构建并运行。
你可以把示例放到 tests/test_getting_stared.c,然后使用仓库的 Makefile / Xcode 工程编译,或手动编译并链接生成的库。
make .bin target=tests build=getting_stared
构建Makefile编译示例(通用说明):
下面是一个通用的手工编写Makefile 编译命令(需根据你的 bin/ 输出目录和架构调整):
# 当前项目目录, 例子为:./Makefile
SRCROOT := $(abspath .)
# libcc 路径,注意:修改为你自己的路径!
LIBCC_SRC_ROOT := /opt/libcc
#生成的文件名,你可以随意起名
TARGET_NAME ?= getting_stared
#Makefile 基础定义
include $(LIBCC_SRC_ROOT)/build/local-init.mk
#macOS 系统 包含homebrow路径,根据你自己需求选择
ifeq ($(PLATFORM), osx)
INCLUDE_PATH += /opt/homebrew/include
LIBRARY_PATH += /opt/homebrew/lib
endif
#包含libcc.so 动态库
LIBS += cc
#包含libcc 路径
INCLUDE_PATH += $(LIBCC_SRC_ROOT)/include
LIBRARY_PATH += $(LIBCC_SRC_ROOT)/bin/$(ARCH)/$(CONFIGURATION) $(LIBCC_SRC_ROOT)/lib/$(ARCH)/$(CONFIGURATION)
#你项目的源文件
LOCAL_SRC_FILES += $(SRCROOT)/getting_stared.c
#Makefile 构建脚本
include $(LIBCC_SRC_ROOT)/build/Makefile.mk
注意:
- 在 macOS Apple 机器上,请使用对应的架构目录(例如 bin/arm64/debug)。
- 若找不到 libcc 动态库,请查看 build/ 输出或使用 Xcode 打开 proj.OSX/cc.xcodeproj 来编译并调试。
示例代码:
#include <stdio.h>
#include <libcc.h>
static bool_t timer_cb(_cc_async_event_t *async, _cc_event_t *e, const uint32_t which) {
if (which & _CC_EVENT_TIMEOUT_) {
_cc_logger_info(_T("[event-loop] timeout ident=%d data=%ld"), e->ident, e->data);
/* 停止事件循环 */
async->running = false;
return false;
}
return true;
}
int main(void) {
_cc_async_event_t async;
_cc_event_t *ev;
/* 在平台上注册 poller(macOS 使用 kqueue) */
if (!_cc_register_poller(&async)) {
fprintf(stderr, "register failed\n");
return -1;
}
/* 添加 2 秒定时器 */
ev = _cc_add_event_timeout(&async, 2000, timer_cb, 42);
if (!ev) return -1;
/* 事件循环 */
while (async.running) {
async.wait(&async, 500);
}
async.free(&async);
return 0;
}
完成并运行示例后,可继续查看:事件循环、TCP 服务端/客户端示例、HTTP/WS 示例等教程。