Fork me on GitHub

Net-SNMP企业节点动态库编辑

查阅net-snmp的相关资料,目前Net-SNMP有多种使用方式。本文只介绍snmpd + 企业私有节点动态库的方式。目前这种方式也在多数企业中得到广泛使用。使用这种方式的优点:不用修改net-snmp源码;第一次交叉编译net-snmp生成snmpd后,后面新增feature,修复bug等不需要重新编译net-snmp源码,仅仅维护企业节点动态库就可以了。

企业节点动态库初始化函数

在使用mib2c工具自动生成相应代码后,还需要在代码中添加一个启动函数,该启动函数是snmpd守护进程调用企业节点动态库的入口

1
2
3
void init_bmserv(void){
...

该函数bmserv的命名应同生成的动态库名称libbmserv.so要保持一致

Makefile

交叉编译动态库,模版makefile如下(根据实际环境进行修改适配):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#************************************************************
# 通用Makefile
#************************************************************
CC = aarch64-linux-gnu-gcc

#************************************************************
# 编译选项
#************************************************************
# 宏定义选项
MACRO_FLAGS :=

# 使用到的库,只要写lib后的名称,不用加.so或.a
LIB_FLAGS := curl crypto cjson

# 编译.c到.o文件的选项
CC_FLAGS := -Wall -fPIC

# 连接.o文件用到的选项
LINK_FLAGS := -Wall -fPIC -lpthread -shared

#************************************************************
# 源代码目录
#************************************************************
ROOT := $(shell pwd)
SRCDIRS := $(ROOT)

# ************************************************************
# 头文件目录
# ************************************************************
INCLUDE_DIRS := $(ROOT)/../../../../prebuilt/3rdparty/curl-7.60.0/include/
INCLUDE_DIRS += $(ROOT)/../../../../prebuilt/3rdparty/net-snmp/include/
INCLUDE_DIRS += $(ROOT)/../../../../prebuilt/3rdparty/cJSON/include/

#************************************************************
# 动态库、静态库目录
#************************************************************
LIB_DIRS := $(ROOT)/../../../../prebuilt/3rdparty/curl-7.60.0/lib/arm64/
LIB_DIRS += $(ROOT)/../../../../prebuilt/3rdparty/net-snmp/lib/arm64/
LIB_DIRS += $(ROOT)/../../../../prebuilt/3rdparty/cJSON/lib/arm64/
LIB_DIRS += $(ROOT)/../../../../prebuilt/3rdparty/openssl/lib/arm64/

#************************************************************
# 最终生成的程序名称
#************************************************************
TARGET := libbmserv.so

#************************************************************
# 被编译的.c文件
#************************************************************
SRC_C := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

#************************************************************
# 所有的.o文件
#************************************************************
OBJ_C := $(notdir $(patsubst %.c, %.o, $(SRC_C)))

#************************************************************
# 编译规则
#************************************************************
.PHONY: all cmd_init cmd_last clean
all:cmd_init $(TARGET) cmd_last

# 编译前命令
cmd_init:
@echo "SRC DIR:" $(SRCDIRS)
@echo cmd_init

# 编译后命令
cmd_last:
@echo cmd_last

VPATH = $(SRCDIRS)
$(TARGET):$(OBJ_C)
$(CC) $(LINK_FLAGS) $(MACRO_FLAGS:%=-D%) $(INCLUDE_DIRS:%=-I%) $(LIB_DIRS:%=-L%) -o $@ $^ $(LIB_FLAGS:%=-l%)

$(OBJ_C):%.o:%.c
$(CC) $(CC_FLAGS) $(MACRO_FLAGS:%=-D%) $(INCLUDE_DIRS:%=-I%) -c -o $@ $<

clean:
rm -f *.o
rm -f $(TARGET)

编译

1
$make

即可在当前目录下生成企业私有节点动态库libbmserv.so

您的鼓励是我持之以恒的动力