Linux快速开发
1 Makefile编写... 1
1.1 实例解析... 1
1.1.1 makefile文件... 1
1.1.2 包含的makefile.global 3
1.2 使用makefile文件... 5
2 Linux编译... 5
2.1 Linux编译步骤... 5
3 Linux调试gdb. 6
4 以服务的形式在linux上运行程序... 7
4.1 执行步骤... 7
4.2 安装服务脚本ivmsservice.sh. 8
5 linux抓包tcpdump与wireshark. 18
5.1 安装卸载tcpdump. 18
5.2 tcpdump抓包到文件... 18
5.3 分析抓包文件... 19
6 分析dump文件... 19
1 Makefile编写
Makefile 是一种linux编译程序的命令集合;通过makefile对程序进行编译和链接;
1.1 实例解析
1.1.1 makefile文件
下面是一个完整的makefile的实例;
#定义C语言文件编译命令变量,gcc是编译命令 –o0表示禁用优化,后面是参数
CC = gcc -o0
#定义C++文件编译命令变量,g++是编译命令 –o0表示禁用优化,后面是参数
CPP = g++ -o0
#定义make的变量
MAKE = make
#定义去除字符串首尾空格的变量
STRIP = strip
#定义根目录的变量,..表示makefile文件所在目录的上一级
TOP_DIR = ..
#包含文件,像是c++里的头文件,里面有一些定义
include Makefile_cmsws_ass_stub_linux.global
#定义静态库的变量,$(LD_STATIC_LIB)在global中的变量
LD_STATIC_LIB := $(LD_STATIC_LIB)
#定义动态库的变量,$( LDLIBS)在global中的变量
LDLIBS := $(LDLIBS) -lgsoap -lhlog -liconv -lssl -lcrypto
#定义生成目标文件,名称和路径
TARGET = $(LIB_DIR)/libcmsws_ass_stub.so
#定义变量生成中间对象文件,
OBJ_DIR := $(TOP_DIR)/obj
#定义创建对象文件夹的命令,shell语句用来判断是否存在,并创建对象文件夹
MAKE_OBJ_DIR := $(shell if [ ! -d $(OBJ_DIR) ]; then mkdir $(OBJ_DIR) ; fi )
#定义创建对象文件夹的子文件的命令,
MAKE_OBJ_SUBDIR := $(shell for sub_dir in $(VPATH); do if [ ! -d $(OBJ_DIR)/$$sub_dir ]; then mkdir $(OBJ_DIR)/$$sub_dir; fi ; done; )
#定义源文件变量,$(VPATH)是程序目录,*意思是获取程序目录下的所有文件名,最后得到的就是所有文件名组成的字符串,以空格隔开;
SOURCES := $(foreach dir, $(VPATH), $(wildcard $(dir)/*))
#filet是过滤出所有的c文件名称,筛选出.c文件,也就是C语言文件
C_SRCS := $(filter %.c, $(SOURCES))
#filet是过滤出所有的c++文件,筛选出C++文件
CPP_SRCS := $(filter %.cpp, $(SOURCES))
#定义源文件变量,所有的C文件和C++文件
SRCS := $(C_SRCS) $(CPP_SRCS)
#定义对象文件变量,包含所有的对象文件,patsubst是字符串替换函数,将文件名字的后缀都改成.o,表示生成的对象文件的名称patsubst是命令,%.c表示要替换的文件名通配符,%.o表示要替换后的文件名通配符;
OBJS := $(patsubst %, $(OBJ_DIR)/%, $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SRCS))))
#定义编译规则,目标:源文件 编译命令;生成c语言的对象文件,$(CC)是gcc编译命令;格式为 目标($(OBJ_DIR)/%.o):生成目标的源文件(%.c) 编译命令($(CC)) 编译参数(-g3 表示加入调试信息,$(CFLAGS)包含一些参数和头文件);如果头文件或者源文件比.o文件要新,则会重新编译;
$(OBJ_DIR)/%.o:%.c
$(CC) -g3 -c $(CFLAGS) $< -o $@
#定义编译规则,目标:源文件 编译命令;生成c++的对象文件
$(OBJ_DIR)/%.o:%.cpp
$(CPP) -g3 -c $(CPPFLAGS) $< -o $@
#生成目标文件,包含所有的对象文件,动静态库
all: $(OBJS)
$(CPP) -g -shared $(OBJS) -fPIC $(LDFLAGS) $(LDLIBS) $(LD_STATIC_LIB) -o $(TARGET)
#生成伪目标文件,用来清除文件不生成真的文件,执行 make –f Makefilename clean 就会清除生成的目标文件和中间对象文件;
clean:
-rm -f $(TARGET) $(OBJS)
1.1.2 包含的makefile.global
CC = gcc
CPP = g++
MAKE = make
STRIP = strip
##define inc_dir
#定义工程根目录变量
PROJ_BASE = $(TOP_DIR)
#定义头文件目录变量
INC_DIR = $(TOP_DIR)/cmsws_alarm_server_service_stub\
$(TOP_DIR)/cmsws_lib/cmsws \
$(TOP_DIR)/cmsws_lib/hlog \
$(TOP_DIR)/cmsws_lib/iconv \
$(TOP_DIR)/cmsws_platform/windows \
$(TOP_DIR)/cmsws_lib/cmsws_ass_stub\
$(TOP_DIR)/cmsws_alarm_server_service_stub/service_stub \
$(TOP_DIR)/cmsws_alarm_server_service_stub/ass_stub_interface \
#源文件路径
VPATH+=$(TOP_DIR)/cmsws_platform/windows $(TOP_DIR)/cmsws_alarm_server_service_stub/service_stub $(TOP_DIR)/cmsws_alarm_server_service_stub/ass_stub_interface $(TOP_DIR)/cmsws_alarm_server_service_stub
#set so compile options
#定义so文件的编译的参数变量
SOFLAGS = -shared -fPIC
#-fstack-check -fvisibility=hidden
#定义C文件的编译的参数变量
CFLAGS := $(CFLAGS) -m64 $(SOFLAGS) $(patsubst %, -I%, $(INC_DIR))
#定义C++文件的编译的参数变量
CPPFLAGS := $(CFLAGS) -fPIC -ftemplate-depth-128
#定义动态库的目录变量
LIB_DIR = $(TOP_DIR)/linux_lib_x64
#定义静态库的目录变量
STATIC_LIB_DIR = $(TOP_DIR)/linux_lib_x64
#定义动静态库的编译的参数变量
LDFLAGS := $(LDFLAGS) $(SOFLAGS) -Wl,--hash-style=both -Wl,-Bsymbolic -Wl,--enable-new-dtags -Wl,-rpath,./
LDLIBS := $(LDLIBS) -lpthread -lstdc++ -lrt $(patsubst %, -L%, $(LIB_DIR))
LD_STATIC_LIB := $(LD_STATIC_LIB) $(patsubst %, -L%, $(STATIC_LIB_DIR))
1.2 使用makefile文件
使用上述makefile文件作为模板,修改源文件目录、头文件目录,生成的目标名称,包含的动静态库,动静态库路径;就可以使用这个模板轻松编译linux程序;
2 Linux编译
2.1 Linux编译步骤
(1)采用secureCRT软件,登陆linux服务器,进入makefile所在文件夹,执行makefile文件。如下图所示;编译中出现错误则根据提示修改;
(2)编译成功后,程序不一定能够执行;需要执行ldd –r libalarm_logic_unit.so,查看目标文件libalarm_logic_unit.so是否缺少库文件或者未定义的函数;相当于window下的depend工具;
根据提示添加缺少的库文件,修改错误,未识别的符号有的是一些乱码,可用下列命令来查看具体的原因;c++filt _ZNSbIhSt11char_traitsIhESaIhEE4_Rep20_S_empty_rep_storageE
(3)软连接,一些开发者提供的库文件后缀一般是.so.1.0.0的格式,这样makefile无法识别,需要通过ln –s libssl.so.1.0.0 libssl.so 创建软连接libssl.so 指向libssl.so.1.0.0;软连接相当于C++中引用的概念,是个别称;
3 Linux调试gdb
-
gdb alarm_logic_unit 。 gdb加程序名称,表示调试该程序;
-
b 。加函数名称或者 源文件名称:行号,来加断点;
-
r 。运行程序进行调试;执行到断点处会停住;
-
p 。变量名称 来查看变量的值;
-
c 。继续执行到下一个断点;
-
n 。单步执行;
-
l 。查看下面要执行的几行代码;
-
q退出gdb;
4 以服务的形式在linux上运行程序
4.1 执行步骤
(1)复制文件工具
WinSCP是一款可视化的文件复制工具,可以方便的将windows系统中的文件复制到linux系统中;如下图所示,现在windows系统中登陆linux系统,然后通过拖动的方式将文件来回复制;
(2)编写脚本程序
编写六个脚本文件*.sh文件,文件的内容如下;./ivmsservice.sh是安装卸载服务的文件,待会介绍;
安装服务脚本install.sh:./ivmsservice.sh install alarm_logic_unit
卸载服务脚本uninstall.sh:./ivmsservice.sh uninstall alarm_logic_unit
启动服务脚本start.sh:service alarm_logic_unit start
停止服务脚本stop.sh:service alarm_logic_unit stop
服务状态脚本status.sh:service alarm_logic_unit status
重启服务脚本restart.sh:service alarm_logic_unit restart
(3)转换文件格式,在windows环境下编写的文件在linux下执行会因为换行符的不同而无法执行,window下是/n/r,linux下是/n,所以需要进行格式转换;先用命令:sudo yum install dos2unix 下载安装dos2unix程序;然后在用dos2unix *.sh命令转换所有的sh文件格式;
(4)先执行安装脚本,在执行启动脚本,再用命令ps –ef 显示电脑的进程,看是否都安装启动成功;执行statu.sh脚本查看状态,执行stop.sh 停止服务,执行uninstall.sh卸载服务;如果无法停止服务,可以用kill 进程id(12897)命令,通过进程id号杀死进程;