前言
HPSocket开源代码,一个高性能的socket通信库,提供了丰富的功能和简单的调用方式,使用前需要自己把源码编译出静态库和动态库,以供在代码中链接使用。本文记录了HPSocket在arm-linux平台的交叉编译过程。
1. 下载HPSocket源码包
我下载的版本是HP-Socket-v5.9.3.tar.gz,在Linux的用户下新建 hpsocket 目录,并进入到hpsocket目录。
把 HP-Socket-v5.9.3.tar.gz 存放到hpsocket目录,并使用如下命令解压。
tar -xvzf HP-Socket-v5.9.3.tar.gz
2. 增加编译脚本的可执行权限
进入 HP-Socket-v5.9.3/Linux/script 目录,执行 chmod +x *.sh
3. 配置交叉编译工具
下一步的编译中需要指定交叉编译工具,所以需要提前配置好交叉编译工具的路径。我用到的交叉编译工具是arm-linux-gnueabihf-g++,如果执行 arm-linux-gnueabihf-g++ -v 命令,有如下结果输出,说明已经配置ok。
配置方法如下:
我在嵌入式平台厂商提供的Linux SDK的根目录下,执行的如下命令。你需要进入到自己平台的对应目录下执行如下命令。
export FMQL_LINUX_SDK=$(pwd)
export ARCH=arm
export CROSS_COMPILE=${FMQL_LINUX_SDK}/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
export PATH= ${FMQL_LINUX_SDK}/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:$PATH
4. 开始编译
./compile.sh -c arm-linux-gnueabihf-g++ -p arm
等待几分钟,编译完成。编译结果生成到 Linux/lib 目录。
lib/hpsocket 目录下的编译结果供C++语言编译使用。
lib/hpsocket4c 目录下的编译结果供C语言编译使用。
.a为静态库,.so为动态库,_d为调试版本
5. C代码中使用动态库
第一步,新建hpsocket_test_c目录,新建 hpsocket_test_c/hpsocket-5.9.3 目录。
第二步,复制 hpsocket/HP-Socket-v5.9.3/Linux/include 到 hpsocket_test_c/hpsocket-5.9.3 目录,把 libhpsocket4c.so 也复制过来。
第三步,编写 hpsocket_test.c 和 makefile
hpsocket_test.c 文件
#include "stdio.h"
#include "hpsocket/HPSocket.h"
int main()
{
printf("HPSocket test in\n");
return 0;
}
makefile文件
CC = arm-linux-gnueabihf-g++
CFLAGS = -Wall
# 指定hpsocket头文件目录
INCLUDES = -I./ -I./hpsocket-5.9.3/include
LDFLAGS = -lpthread -lm
# 调用libhpsocket4c.so动态库
LDFLAGS += -lhpsocket4c -L./hpsocket-5.9.3
OBJS = hpsocket_test.o
all : hpsocket_test
# $@: 表示目标
# $<: 表示第一个依赖
# $^: 表示所有的依赖
# make hpsocket_test
hpsocket_test:$(OBJS)
$(CC) -o ../bin/$@ $^ $(LDFLAGS)
# 编译.o文件
%.o:%.c
$(CC) -c $< -o $@ $(INCLUDES) $(CFLAGS)
# 表示伪目标,防止有同名文件,可以加上.PHONY:clean
.PHONY:clean
clean:
rm -f hpsocket_test
rm -f *.o
注:需要使用 arm-linux-gnueabihf-g++ 来进行编译。
编译通过,就可以在此基础上编写一个简单的tcp client程序。
6. 基于C代码的TCP客户端程序
TODO