常用命令:
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,库,环境变量以及部分命令
最新推荐文章于 2024-04-02 20:54:09 发布