Linux--gcc,库,环境变量以及部分命令

常用命令:
    gcc的参数
        -c
        -o filename,指定输出文件的名字
        -Wall,显示全部的警告
        -std=c99 
        -S,产生汇编代码
        -E,只做预处理
        -On,优化,n是1,2,3
        -i filename,指定要包含的叫filename头文件
        -Idir,指定头文件所在的目录是dir
        -llib,指定要使用的库名,标准库不用使用,默认使用
        -Ldir,指定库文件所在的目录
        -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
        不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)如果被多个应用程序共同使用,那么它们必须每个程序维护一份.so的代码副本了.(因为.so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)         
        -shared 生成动态库
        -static 使用静态库
        -g 产生调试信息,在可执行文件中
        --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl,字串。
            --whole-archive 可以把在其后面出现的静态库包含的函数和变量输出到动态库
            --no-whole-archive 则关掉这个特性
    文件路径:
        绝对路径:
            从/说起
        相对路径:
            从.
环境变量:
        env查看环境变量,查看的是全局的环境变量
        set查看更多的环境变量,包括局部的环境变量
    设置环境变量的方法:
        方法1:变量名=变量值,这样设置是局部变量
        方法2:export 变量名=变量值,这样是设置全局变量
        都是对当前的进程而言,进程杀死后就会丢失,需要重新设置
        全局变量的话会传递给子进程
        局部变量则仅仅是父进程使用
    ps -f 看到详细进程
    ps -l 看到更详细的进程消息
    ps -e 看到当前中断的所有进程
    进程状态:
        S -- 睡眠等待状态
        T -- 停止状态
        R -- 正在运行的状态
            有两个进程都是R状态说明这个计算机有两个CPU或者模拟双核的
        Z -- 僵尸进程
        jobs命令显示后台任务,+好表示享有优先权的
        bg %n让编号为n的后台进程进入到后台,不加%n就是让+的进程运行在后台
        fg %n就是调到前台运行
    env查看环境变量,然后
    OLDPWD=/home/root就是环境变量
    这里就可以通过echo $OLDPWD来打出路径
    有的时候OLDPWD='ls -l'这样的环境变量
    运行OLDPWD就是执行ls -l命令
    grep -H -n 字符串 filename,从文件中查找字符串-H是显示文件名,-n是显示行号,-i是忽略大小写,如果没有指定文件名则从标准输入中查找
    管道|就是把上一个命令的结果作为下一个命令的参数
    PATH环境变量:一系列目录,用冒号隔开,系统只在这些目录下寻找可执行文件。为了能够在当前目录下找可执行文件,一般咱们执行PATH=$PATH:.,把当前目录作为PATH值的一部分
export PATH=`pwd`:$PATH
export是修改PATH环境变量
PATH='pwd'含义pwd是当前目录,PATH是设置环境变量PATH为当前目录
:$PATH就是追加到环境变量中的位置
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH    
同上
库:
    静态库:libxxxx.a
        调用这个库,在编译链接的时候就把库里边用到的东西,提取出来,加入到最后的可执行文件中,程序执行时不再需要这个库
        产生库:gcc -c xxx1.c xxx2.c这个时候产生.o文件
                写一个头文件
                ar -r libxxx.a xxx1.o xxx2.o这就生成了一个静态库
        使用库:
                写一个c程序,包含.h跟.a文件,这就可以调用库中的函数了
                编译:
                方法1:
                    gcc -c xxx.c
                    gcc xxx.o libxxx.a 
                方法2:
                    gcc -c xxx.c
                    gcc xxx.o -lxxx -Lpath,-lxxx表示要链接libxxx.a文件,-L是到哪个目录下去查找库文件夹
    共享库:libxxxx.so
            产生库:gcc -c -fPIC xxx1.c xxx2.c这个时候产生.o文件
                写一个头文件
                gcc -shared -o libxxx.so xxx1.o xxx2.o这就生成了一个动态库
            使用库:
                编译时:
                    编写程序xxx.c
                    方式1:
                        gcc -c xxx.c
                        gcc xxx.o -lxxx -Lpath
                    方式2:
                        gcc -c xxx.c
                        gcc xxx.o -lxxx
                    先设置环境变量LIBRARY_PATH
                运行时:
                    方式1:
                        把库文件放到系统标准库的目录中,/usr/lib或者/lib中,就可以运行a.out,如果更新需要重启之后,才能运行更新后的动态库
                    方式2:
                        设置环境变量,LD_LIBRARY_PATH的值位动态库所在的目录,然后运行a.out
        动态库则是在编译链接的时候只记录要用的名字在哪个库文件中,使用的时候才会去里边找这个名字,这个名字可能是函数也可能是变量,并且访问他
    静态库的可执行文件比较大,以后对这个库修改后,不会对当前的可执行文件修改
    库的升级,是动态库更好,但是静态库运行速度更快,内存上也是使用动态库比较好
CPATH
C_INCLUDE_PATH,这两个环境变量在GCC编译的时候都可以搜索头文件的目录,一般不用

你可能感兴趣的:(Linux--gcc,库,环境变量以及部分命令)