21-软件安装-原始码与Tarball

来源:互联网 发布:编程培训周末班 编辑:程序博客网 时间:2024/05/17 19:16

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1

Welcome to my github: https://github.com/gaoxiangnumber1

21.2 使用传统程序语言进行编译

21.2.1 单一程序:印出 Hello World

21.2.2 主、子程序链接:子程序的编译

xiang :~ $ cat main.c#include <stdio.h>int main(){    printf("gaoxiangnumber1\n");    fun();}xiang :~ $ cat fun.c #include <stdio.h>void fun(){    printf("This is fun.\n");}xiang :~ $ gcc -c main.c fun.c xiang :~ $ ll main* fun*-rw-rw-r-- 1 xiang xiang   62 1015 19:32 fun.c-rw-rw-r-- 1 xiang xiang 1.5K 1015 19:33 fun.o-rw-rw-r-- 1 xiang xiang   73 1015 19:31 main.c-rw-rw-r-- 1 xiang xiang 1.6K 1015 19:33 main.oxiang :~ $ gcc -o main main.o fun.oxiang :~ $ ll main* fun*-rw-rw-r-- 1 xiang xiang   62 1015 19:32 fun.c-rw-rw-r-- 1 xiang xiang 1.5K 1015 19:33 fun.o-rwxrwxr-x 1 xiang xiang 8.4K 1015 19:33 main-rw-rw-r-- 1 xiang xiang   73 1015 19:31 main.c-rw-rw-r-- 1 xiang xiang 1.6K 1015 19:33 main.oxiang :~ $ ./main gaoxiangnumber1This is fun.
  • 当源文件有多个时,需要先产生目标文件,然后再链接成可执行文件。

21.2.3呼叫外部函式库:加入链接的函式库

  • gcc sin.c -lm -I/usr/include -L/lib -L/lib64
    l 加入某函式库
    m 是libm.so函式库,lib与扩展名(.a或.so)不需要写
    L 后接的路径表示需要的函式库libm.so到/lib或/lib64中搜索。函式库默认存放在/lib与/lib64
    I 后接的路径是设定去搜索相关include文件的目录。默认存放在/usr/include

21.2.4 gcc 的简易用法(编译、参数与链结)

  • -c 仅将源码编译成目标文件.o,不链接
    -O 在编译时优化
    -o 将编译的结果输出成特定文件名
    -Wall 显示警告信息

21.3 用 make 进行宏编译

21.3.1 为什么要用 make

  • 在编译完成后,若修改某原始码文件,make仅会针对被修改的文件进行编译,其它的object file不变动。

21.3.2 makefile的基本语法与变量

target: 目标文件1 目标文件2<tab>gcc -o 执行文件 目标文件1 目标文件2
  • 目标文件是具有相关性的object files。
    命令行必须以tab开头。
    #接注释。
    target与目标文件以:隔开。
  • 变量语法为:
    1. 变量与变量内容以=隔开,两边可以有空格,不能有:
    2. 变量左边不能有tab
    3. 变量最好是大写字母
    4. ${变量}$(变量)使用变量
  • gcc在编译时,会主动读取CFLAGS环境变量,所以可以在shell定义、在makefile文件中定义、在指令列中定义。
root: ~ # CFLAGS="-Wall" make clean main#也可以root: ~ # vi makefileLIBS = -lmOBJS = main.o haha.o sin_value.o cos_value.oCFLAGS = -Wallmain: ${OBJS}    gcc -o main ${OBJS} ${LIBS}clean:    rm -f main ${OBJS}
  • 环境变量读取优先级:
    1. make指令列后面加上的环境变量
    2. makefile中指定的环境变量
    3. shell原来有的环境变量
  • $@代表target。可将makefile改成:
root: ~ # vi makefileLIBS = -lmOBJS = main.o haha.o sin_value.o cos_value.oCFLAGS = -Wallmain: ${OBJS}    gcc -o $@ ${OBJS} ${LIBS} #$@是mainclean:    rm -f main ${OBJS}

21.5 函式库管理

21.5.1动态与静态函式库

静态函式库特点

  • 扩展名为.a
  • 在编译时会直接整合到执行程序中。最大的优点是编译成功的可执行文件可以独立执行,不需要读取外部函式库。
  • 只要函式库升级,所有将此函式库纳入的程序都需要重新编译。

动态函式库特点

  • 扩展名为.so
  • 在编译时,程序只有一个Pointer的位置,即当程序要用到函式库时,才会读取函式库。编译出的程序不能独立执行,函式库文件必须存在,且函式库的目录不能改变。
  • 当函式库升级后,程序不需要重新编译,因为程序会直接指向新的函式库文件(前提是函式库新旧版本的文件名相同)。
  • 绝大多数函式库存放在/lib64、/lib。kernel的函式库放在/lib/modules。

21.5.2 ldconfig 与 /etc/ld.so.conf

21.5.3 程序的动态函式库解析:ldd

ldd [-vdr] [filename]
  • -v 列出所有信息
    -d 重新列出资料有遗失的link
    -r 列出ELF有关的错误内容

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1

Welcome to my github: https://github.com/gaoxiangnumber1

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米2s开机闪退怎么办 小米手机打不开机怎么办 苹果手机打电话闪退怎么办 红米手机通话时黑屏怎么办 小米手机通话时是黑屏怎么办? 华为手机通话时出现黑屏怎么办 微信屏幕变黑了怎么办 乐视手机打不开机怎么办 金立手机屏幕不亮怎么办 笔记本开不了机怎么办屏幕黑屏 红米4刷机失败怎么办 红米手机开不了机怎么办 红米not开不了机怎么办 红米2开不起机怎么办 小米手机免提声音小怎么办 红米手机1s黑屏怎么办 红米2完全黑屏怎么办 红米note3接电话黑屏怎么办 红米note3死机黑屏怎么办 红米note2开机之后黑屏怎么办 红米手机白屏怎么办 红米4黑屏打不开怎么办 oppo手机拨打电话时黑屏怎么办 华为手机拨打电话时黑屏怎么办 小米6x拨电话黑屏怎么办 魅族手机打电话黑屏怎么办 三星手机拨打电话时黑屏怎么办 华为畅享5打电话黑屏怎么办 小米note通话声音小怎么办 金立m5黑屏开不了机怎么办 金立手机光感器坏了怎么办 红掌根部烂了怎么办 魅族相册闪退怎么办 魅族手机闪退怎么办 苹果6手机主页面打不开怎么办 手机中病毒闪退怎么办 酷派手机开机黑屏怎么办啊 酷派手机黑屏打不开怎么办 酷派手机不开机怎么办 乐视手机开不了机怎么办 vivo手机拨号键盘不见了怎么办