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

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

拷贝到当前目录:
cp …/day01/cleanipc .

清除ipc命令:
cleanipc zhidao101 all

查看网络连接:
netstat -an | grep 8001

查看用户进程:
ps -u zhidao101

执行文件夹压缩命令:
 tar -cvf usr_lib.tar /usr/lib

如果从服务器上传下载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

    1
    2
    3
    4
    5

( E X E 1 ) : (EXE1): (EXE1):(OBJS)

$(CC)  $^ $(LIBFLAG) -lmysocket  -o $@

    1

.c.o:

$(CC) $(CFLGS) -c $< -o $@  -shared -fPIC

    1

clean:

rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)

    1

查看程序的内存大小:
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 -cvf usr_lib.tar /usr/lib

解压: tar -zxvf 文件名.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

    1
    2
    3
    4
    5

( E X E 1 ) : (EXE1): (EXE1):(OBJS)

$(CC)  $^ $(LIBFLAG) -lmysocket  -o $@

    1

.c.o:

$(CC) $(CFLGS) -c $< -o $@  -shared -fPIC

    1

clean:

rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)

    1

查看程序的内存大小:
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值