1 环境变量的概念和使用
1.1 基本概念
环境变量一般是指在操作系统中用来指定操作系统运行环境./应用程序环境的一些变量
path 就是一个环境变量,一般来说应用程序的执行需要带上路径才可以运行,而定义在环境变量path 中的路径,系统会自动识别,因此对应的应用程序只需要程序名称即可运行。
1.2 基本配置
1 Windows 中的配置
我的电脑 -属性- 高级-环境变量-系统变量-path -点编辑,在path 变量后面增加分号,用于分隔路径,在追加新的路径,设置确定,
注意不要删除原来Path 变量原来的变量值,避免出现系统无法启动或者正常运行的情况
2 UNIX/Linux系统中的配置
echo 字符串 表示字符串原样输出,回显
echo $SHELL 表示获取SHELL 的值,进行回显
echo $PATH 获取PATH 的值进行回显打印
export PATH=$PATH:. 解释 export 表示导入,PATH 表示环境变量
$PATH 表示把变量值的取出来。获取环境变量中原来的数值。后面的就是自己加上的路径,:代表分隔,.代表当前的路径
所以这句话的意思就是把当前目录的路径追加到环境变量的值中。
echo $SHELL
但是这行指令只是针对当前终端有效,一次性的。
vi ~/.bashrc 打开文件,在文件最后增加代码,~/代表主目录下,.开头代表隐藏文件,是bash 的配置文件。在这里配置就是永久性的,
export PATH=$PATH:.
export PS1='\W$' 这里 '\W$'表示只显示一个单词,$结尾。
表示终端的提示符只显示一个单词,使用$结尾
source ~/.bashrc
使得配置文件立即生效
1.3 编程相关的环境变量
C_INCLUDE_PATH/CPATH-C c头文件的附加搜索路径,这里没下划线。
CPLUS_INCLUDE_PATH-C++ C++头文件的附加搜索路径
LIBRARY_PATH - 链接库文件时候查找路径
LD_LIBRARY_PATH - 运行时查找共享库的路径
1.4 头文件的查找方式
1 #include
表示去系统默认的路径中查找该头文件
whereis +文件 查找文件位置。
2 #include“xxx”
表示优先在当前工作目录下进行查找,这个双引号之内可以加路径,就是../这样,我靠 这也可以,我以前都没见过。
如果保证代码不变进行对C文件的头文件库进行配置
export CPATH=$CPATH:..
这样可以设置头文件的包含路径
3 配置环境变量
export CPATH =$CPATH:..
一次性的,永久的需要加入bash中。这种配置的缺陷是,当有多个工程的时候,环境变量的位置可能引发冲突。
4 使用编译选项 -I
gcc/cc *.c -I 头文件目录
gcc/cc *.c -I ..
最好的方案了,建议使用这种方案,
注意
对于查找头文件的方式12 来说,缺点是一旦头文件的位置发生改变,需要修改源代码,3 的缺陷是多个工程会相互影响,建议使用方案4;
练习
多文件编程结构,实现计算两个int 类型参数的和,通过返回值返回的自定义函数。
2 库文件的概念
1.1 概念
为了调用者使用方便,一般不会直接提供对应的.c或者.o文件,而是根据具体的功能模块,将对应的多个.o 文件打包一个/多个库文件,给调用者提供库文件和头文件即可。
库文件主要分成两种, 静态库和共享库
1 静态库
1 静态库使用时候,直接把代码复制到目标文件中,
优缺点
优点 就是 不需要跳转,效率比较高,脱离静态库。
缺点 目标文件比较大,维护和修改都不方便
2 共享库
共享库使用时候,是把代码的地址复制过来,
优点 目标文件比较小,维护和修改都比较方便
缺点 需要跳转,效率低,不能脱离共享库文件
基本命令
ldd +可执行文件 可以得到他所链接的文件
gcc/cc -static *.c -o b.out 强制要求使用静态库方式生成可执行文件
比较发现静态库方式生成的文件比较大
2.2静态库的生成和使用
1 静态库的生成
a 编写源代码 xxx.c
b 只编译不链接生成目标文件 xxx.o文件
gcc/cc -c add.c
c 生成静态库文件
ar -r / 插入/ lib库名.a 目标文件
ar -r libadd.a add.0
注意
静态库的文件名的命名规则, 以lib 开头,以.a 结尾
静态库文件名和库名是不同的概念,库名没前缀和后缀
2 静态库的使用步骤
a 编写测试源代码 xxx.c
b 只编译不链接生成目标文件 xxx.o
gcc/cc -c main.c
c 链接测试文件和静态库文件,连接方式有三种
1 直接链接
cc main.o libadd.a
2 编译选项进行编译链接
gcc/cc main.o -l 库名 -L 库文件所咋的路径
gcc/cc mian.o -l add -L .
3 掌握第二种就可以,第三种是第二种的变形,配置环境变量LIBRARY_PATH
export LIBRARY_PATH =$LIBRARY_PATH:.
gcc/cc main.o -l add 省略了第二种之中的路径
使用是直接链接静态库文件就可以生成可执行文件,链接时候可以链接多个静态库文件。
cp -r 复制整个文件夹, cp 复制一个文件。
共享库的生成和使用步骤
1 生成步骤
1 编写源码
2 只编译不连接生成目标文件
gcc/cc -c -fpic //小模式代码少) add.c
3 生成共享库文件
gcc /cc -shared 目标文件 -o lib库名.so
gcc/cc -shared /共享/ add.o -o libadd.so
2 共享库的使用
a 编写测试源代码 xxx.c
b 只编译不链接生成目标文件 xxx.o
gcc/cc -c main.c
c 链接测试文件和共享库文件,连接方式有三种
1 直接链接
cc main.o libadd.so
2 编译选项进行编译链接
gcc/cc main.o -l 库名 -L 库文件所咋的路径
gcc/cc mian.o -l add -L .
3 掌握第二种就可以,第三种是第二种的变形,配置环境变量LIBRARY_PATH
export LIBRARY_PATH =$LIBRARY_PATH:.
gcc/cc main.o -l add 省略了第二种之中的路径
ldd 查看共享库的信息
直接生成运行的时候会发生错误,找不到共享库文件。需要配置运行时的共享库环境变量配置。
export LD_LIBRARY_PATH =$LD_LABRARY_PATH:.
注意事项,共享库的实现需要要求配置环境变量,LD_LIBRARY_PATH 的值,主要解决运行时找不到共享库的问题。