入门:构建并运行第一个示例


本教程演示如何在本地构建 libcc 并运行一个最小示例:创建一个异步事件管理器,注册一个 1 秒后触发的计时器,触发后打印日志并退出。

先决条件

  • macOS(或 Linux),命令行工具(Xcode Command Line Tools)查看:Build tools提供详细说明方法
  • 已安装 gitmake 和常见编译工具链
  • 仓库已 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 示例等教程。