Linux编译动态库和gdb调试命令

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

静态库生成:

  1. touch myadd.h myadd.c
  2. 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;
    }
  3. vi myadd.h
    extern int myadd(int a,int b);
  4. vi mygcca
    gcc -c myadd.c -o myadd.o
    ar rcs libmyadd.a myadd.o #ar是归档工具,rcs打包
    chmod 775 mygcca
  5. ./mygcca 生成libmyadd.a文件

查看文件的属性:
file libmyadd.a

查看文件的函数描述:
nm libmyadd.a

调用静态库:

  1. 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;
    }
  2. gcc -L. main.c -o main.exe -lmyadd #-L指定静态库目录
  3. ./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

从目录调用静态库:

  1. ls test==> mygcctest main.c libmyadd.a
  2. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe
  3. tail mygcctest
    rm libmyadd.a #可执行程序生成之后就可以脱离静态库

动态库生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜索与路径无关

查看文件的函数描述:
nm libmyadd.so | grep “myadd”

调用动态库:

  1. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe -lmyadd
  2. ls libmyadd.so main.c mygcctest
  3. ./mygcctest

查看程序链接的库(动态库和静态库):
ldd main.exe

查看文件属性:
file main.exe

动态库和静态库编译的时候,可以把动态库和静态库copy到gcc脚本的目录下
gcc能找到动态库和静态库

动态库配置路径:

  1. 拷贝.so到系统共享库目录下/usr/lib
    cp libmyadd.so $HOME/lib
  2. vi .bash_profile
    添加:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
    export LD_LIBRARY_PATH
  3. 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): (LIBOBJS)

$(CC) -shared -fPIC $^ -o $@

cp  $(LIB1) $(HOME)/lib

mv  $(LIB1) ./lib

( E X E 1 ) : (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

静态库生成:

  1. touch myadd.h myadd.c
  2. 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;
    }
  3. vi myadd.h
    extern int myadd(int a,int b);
  4. vi mygcca
    gcc -c myadd.c -o myadd.o
    ar rcs libmyadd.a myadd.o #ar是归档工具,rcs打包
    chmod 775 mygcca
  5. ./mygcca 生成libmyadd.a文件

查看文件的属性:
file libmyadd.a

查看文件的函数描述:
nm libmyadd.a

调用静态库:

  1. 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;
    }
  2. gcc -L. main.c -o main.exe -lmyadd #-L指定静态库目录
  3. ./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

从目录调用静态库:

  1. ls test==> mygcctest main.c libmyadd.a
  2. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe
  3. tail mygcctest
    rm libmyadd.a #可执行程序生成之后就可以脱离静态库

动态库生成:
vi mygccso
gcc -shared -fPIC -I./inc ./src/myadd.c -o libmyadd.so #-fPIC搜索与路径无关

查看文件的函数描述:
nm libmyadd.so | grep “myadd”

调用动态库:

  1. vi mygcctest
    gcc -L. -I…/inc main.c -o main.exe -lmyadd
  2. ls libmyadd.so main.c mygcctest
  3. ./mygcctest

查看程序链接的库(动态库和静态库):
ldd main.exe

查看文件属性:
file main.exe

动态库和静态库编译的时候,可以把动态库和静态库copy到gcc脚本的目录下
gcc能找到动态库和静态库

动态库配置路径:

  1. 拷贝.so到系统共享库目录下/usr/lib
    cp libmyadd.so $HOME/lib
  2. vi .bash_profile
    添加:LD_LIBRARY_PATH=.:$HOME/lib:/usr/lib
    export LD_LIBRARY_PATH
  3. 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): (LIBOBJS)

$(CC) -shared -fPIC $^ -o $@

cp  $(LIB1) $(HOME)/lib

mv  $(LIB1) ./lib

( E X E 1 ) : (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

猜你喜欢

转载自blog.csdn.net/qq_41220284/article/details/84781174
今日推荐