Linux编译动态库和gdb调试命令TOC
IPC命令:
拷贝到当前目录:
cp …/day01/cleanipc .
清除ipc命令:
cleanipc zhidao101 all
查看网络连接:
netstat -an | grep 8001
查看用户进程:
ps -u zhidao101
执行文件夹压缩命令:
tar zcvf dm_01.tar.gz dm_01/ 生成dm_01.tar.gz
如果从服务器上传下载tar.gz 使用二进制方式
动态库:
查看文件权限:
ls -lt
查看用户空间动态库、头文件:
ls /usr/lib 动态库文件.so
ls /usr/local/lib
ls /usr/include
ls /usr/local/include
链接外部库:
gcc -Wall a.c -o a.exe -lm 链接libm.so或者libm.a
查看程序链接的库:
ldd a.exe
把命令变成脚本:
复制gcc -Wall a.c -o a.exe -lm 到mygcc文件
修改文件权限:
chmod u+x mygcc
chmod 775 mygcc
静态库生成:
- touch myadd.h myadd.c
- vi myadd.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int myadd(int a,int b)
{
int c=0;c=a+b;return c;
} - vi myadd.h
extern int myadd(int a,int b); - vi mygcca
gcc -c myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o #ar是归档工具,rcs打包
chmod 775 mygcca - ./mygcca 生成libmyadd.a文件
查看文件的属性:
file libmyadd.a
查看文件的函数描述:
nm libmyadd.a
调用静态库:
- vi main.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int main(void)
{
printf(“myadd:%d\n”,myadd(3,4));
return 0;
} - gcc -L. main.c -o main.exe -lmyadd #-L指定静态库目录
- ./main.exe
把命令变成脚本:
复制gcc -L. main.c -o main.exe -lmyadd到mygcctest文件
chmod 775 mygcctest
递归复制文件夹:
cp day02 day03 -r
移动所有头文件到inc,所有源文件到src
mv *.h ./inc
mv *.h ./src
gcc常用编译选项:
-o 产生可执行文件
-c 编译源码
-E 预编译
-S 产生汇编
-Wall 发出警告
-ldir dir加入头文件搜索路径
-Ldir dir加入库搜索路径
-llib 链接lib库
-g 嵌入调试信息
从目录编译静态库:
vi mygcca
gcc -c -I./inc ./src/myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o
从目录调用静态库:
- ls test==> mygcctest main.c libmyadd.a
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe - tail mygcctest
rm libmyadd.a #可执行程序生成之后就可以脱离静态库
动态库生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜索与路径无关
查看文件的函数描述:
nm libmyadd.so | grep “myadd”
调用动态库:
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe -lmyadd - ls libmyadd.so main.c mygcctest
- ./mygcctest
查看程序链接的库(动态库和静态库):
ldd main.exe
查看文件属性:
file main.exe
动态库和静态库编译的时候,可以把动态库和静态库copy到gcc脚本的目录下
gcc能找到动态库和静态库
动态库配置路径:
- 拷贝.so到系统共享库目录下/usr/lib
cp libmyadd.so $HOME/lib - vi .bash_profile
添加:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
export LD_LIBRARY_PATH - source .bash_profile
查看环境变量:
env | grep LD*
终端用use+pwd登录服务器,服务器会为用户运行一个shell
这个shell的配置文件$(HOME)/.bash_profile
默认使用/bin/bash
查看环境变量:
echo $PATH
echo $SHELL
查看环境变量的设置:
env
修改shell运行的配置文件,我们需要重新运行配置文件
source .bash_profile
任何目录下执行cd命令 都会转到$HOME
socket项目编译动态库:
ls mysocket_so_test
bin etc inc lib log makefile mysocketexe src test
ls inc
itcast_comm.h itcastlog.h socketclientadd.h
ls src
demo01_tesplatfrom.c ticastlog.c socketclient.c
vi makefile
WORKDIR=.
VPATH = ./src
LIBOBJS= socketclient.o itcastlog.o
OBJS= demo01_testplatform.o
LIB1 = libmysocket.so
EXE1 = mysocketexe
CC = gcc
CFLGS= -Wall -g -I$(WORKDIR)/inc/
LIBFLAG = -L$(HOME)/lib
all: $(LIB1) $(EXE1)
( L I B 1 ) : (LIB1): (LIB1):(LIBOBJS)
$(CC) -shared -fPIC $^ -o $@
cp $(LIB1) $(HOME)/lib
mv $(LIB1) ./lib
( E X E 1 ) : (EXE1): (EXE1):(OBJS)
$(CC) $^ $(LIBFLAG) -lmysocket -o $@
.c.o:
$(CC) $(CFLGS) -c $< -o $@ -shared -fPIC
clean:
rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)
查看程序的内存大小:
size mysocketexe
查看程序的函数描述:
strings mysocketexe
gdb调试选项:
r 运行
l 列出源码
b 设置断点
ib 查看断点信息
c 继续运行至下一个断点
watch 设置观察点
s 单步跟踪,进入函数
n 单步跟踪,不进入函数
finish 运行函数,直到返回
u 退出循环
调试程序:
gdb mysocketexe
b main
b 20
info break
run
n
s
print handle #类型 地址
finish
quit
查找调试文件core
ls -lt | grep “core”
设置文件大小限制:
ulimit -c 3000
打开调试信息:
gdb dem01 core.13973
工程项目方法,组织src和inc编译动态库和静态库:
1.c 2.c 3.c ====>src
1.h 2.h 3.h >inc
libsocket.so>lib
IPC命令:
拷贝到当前目录:
cp …/day01/cleanipc .
清除ipc命令:
cleanipc zhidao101 all
查看网络连接:
netstat -an | grep 8001
查看用户进程:
ps -u zhidao101
执行文件夹压缩命令:
tar zcvf dm_01.tar.gz dm_01/ 生成dm_01.tar.gz
如果从服务器上传下载tar.gz 使用二进制方式
动态库:
查看文件权限:
ls -lt
查看用户空间动态库、头文件:
ls /usr/lib 动态库文件.so
ls /usr/local/lib
ls /usr/include
ls /usr/local/include
链接外部库:
gcc -Wall a.c -o a.exe -lm 链接libm.so或者libm.a
查看程序链接的库:
ldd a.exe
把命令变成脚本:
复制gcc -Wall a.c -o a.exe -lm 到mygcc文件
修改文件权限:
chmod u+x mygcc
chmod 775 mygcc
静态库生成:
- touch myadd.h myadd.c
- vi myadd.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int myadd(int a,int b)
{
int c=0;c=a+b;return c;
} - vi myadd.h
extern int myadd(int a,int b); - vi mygcca
gcc -c myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o #ar是归档工具,rcs打包
chmod 775 mygcca - ./mygcca 生成libmyadd.a文件
查看文件的属性:
file libmyadd.a
查看文件的函数描述:
nm libmyadd.a
调用静态库:
- vi main.c
#include<stdio,h>
#include<string.h>
#include<stdlib.h>
#include “myadd.h”
int main(void)
{
printf(“myadd:%d\n”,myadd(3,4));
return 0;
} - gcc -L. main.c -o main.exe -lmyadd #-L指定静态库目录
- ./main.exe
把命令变成脚本:
复制gcc -L. main.c -o main.exe -lmyadd到mygcctest文件
chmod 775 mygcctest
递归复制文件夹:
cp day02 day03 -r
移动所有头文件到inc,所有源文件到src
mv *.h ./inc
mv *.h ./src
gcc常用编译选项:
-o 产生可执行文件
-c 编译源码
-E 预编译
-S 产生汇编
-Wall 发出警告
-ldir dir加入头文件搜索路径
-Ldir dir加入库搜索路径
-llib 链接lib库
-g 嵌入调试信息
从目录编译静态库:
vi mygcca
gcc -c -I./inc ./src/myadd.c -o myadd.o
ar rcs libmyadd.a myadd.o
从目录调用静态库:
- ls test==> mygcctest main.c libmyadd.a
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe - tail mygcctest
rm libmyadd.a #可执行程序生成之后就可以脱离静态库
动态库生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜索与路径无关
查看文件的函数描述:
nm libmyadd.so | grep “myadd”
调用动态库:
- vi mygcctest
gcc -L. -I…/inc main.c -o main.exe -lmyadd - ls libmyadd.so main.c mygcctest
- ./mygcctest
查看程序链接的库(动态库和静态库):
ldd main.exe
查看文件属性:
file main.exe
动态库和静态库编译的时候,可以把动态库和静态库copy到gcc脚本的目录下
gcc能找到动态库和静态库
动态库配置路径:
- 拷贝.so到系统共享库目录下/usr/lib
cp libmyadd.so $HOME/lib - vi .bash_profile
添加:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
export LD_LIBRARY_PATH - source .bash_profile
查看环境变量:
env | grep LD*
终端用use+pwd登录服务器,服务器会为用户运行一个shell
这个shell的配置文件$(HOME)/.bash_profile
默认使用/bin/bash
查看环境变量:
echo $PATH
echo $SHELL
查看环境变量的设置:
env
修改shell运行的配置文件,我们需要重新运行配置文件
source .bash_profile
任何目录下执行cd命令 都会转到$HOME
socket项目编译动态库:
ls mysocket_so_test
bin etc inc lib log makefile mysocketexe src test
ls inc
itcast_comm.h itcastlog.h socketclientadd.h
ls src
demo01_tesplatfrom.c ticastlog.c socketclient.c
vi makefile
WORKDIR=.
VPATH = ./src
LIBOBJS= socketclient.o itcastlog.o
OBJS= demo01_testplatform.o
LIB1 = libmysocket.so
EXE1 = mysocketexe
CC = gcc
CFLGS= -Wall -g -I$(WORKDIR)/inc/
LIBFLAG = -L$(HOME)/lib
all: $(LIB1) $(EXE1)
( L I B 1 ) : (LIB1): (LIB1):(LIBOBJS)
$(CC) -shared -fPIC $^ -o $@
cp $(LIB1) $(HOME)/lib
mv $(LIB1) ./lib
( E X E 1 ) : (EXE1): (EXE1):(OBJS)
$(CC) $^ $(LIBFLAG) -lmysocket -o $@
.c.o:
$(CC) $(CFLGS) -c $< -o $@ -shared -fPIC
clean:
rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)
查看程序的内存大小:
size mysocketexe
查看程序的函数描述:
strings mysocketexe
gdb调试选项:
r 运行
l 列出源码
b 设置断点
ib 查看断点信息
c 继续运行至下一个断点
watch 设置观察点
s 单步跟踪,进入函数
n 单步跟踪,不进入函数
finish 运行函数,直到返回
u 退出循环
调试程序:
gdb mysocketexe
b main
b 20
info break
run
n
s
print handle #类型 地址
finish
quit
查找调试文件core
ls -lt | grep “core”
设置文件大小限制:
ulimit -c 3000
打开调试信息:
gdb dem01 core.13973
工程项目方法,组织src和inc编译动态库和静态库:
1.c 2.c 3.c ====>src
1.h 2.h 3.h >inc
libsocket.so>lib