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

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.o
xiang :~ $ gcc -o main main.o fun.o
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
-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.o
xiang :~ $ ./main 
gaoxiangnumber1
This 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 makefile LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o CFLAGS = -Wall main: ${OBJS} gcc -o main ${OBJS} ${LIBS} clean: rm -f main ${OBJS}
  • 环境变量读取优先级:
    1. make指令列后面加上的环境变量
    2. makefile中指定的环境变量
    3. shell原来有的环境变量
  • $@代表target。可将makefile改成:
root: ~ # vi makefile
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
    gcc -o $@ ${OBJS} ${LIBS} #$@是main
clean:
    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

你可能感兴趣的:(github,软件,语言)