Linux 编译和makefile的编写

what is 链接

  • 俗语理解
    链接 就是把每个源代码独立地编译为目标文件.o,然后再把他们组装起来,整个组装的过程就是链接。

链接的过程主要包含:地址和空间的分配、符号决议和重定位这些步骤。

编译后的目标文件包含:
(1)自己的数据和二进制代码
(2)未解决符号表;如,extern变量
<3>导出符号表
(4)地址重定向表

  • 静态链接
      对函数库的链接是在编译时期完成的。这些函数库一般是libxxx.a,因为,最后会和相关文件合成一个可执行文件,所以执行文件会很大。

无论是静态库还是动态库,他们的创建都是由.o文件创建的。

静态库创建命令:
g++ -c x.cpp
g++ -c y.cpp
ar cr [libxxx.a] x.o y.o
r选项: 在库中插入模块(存在则替换)。
c选项:创建一个库。不管是否存在,都将创建。
在程序中使用静态库,执行:
g++ -o main main.cpp -L. -lmymath

  • 动态链接
    g++ -fPIC -o x.o -c x.cpp
    g++ -fPIC -o y.o -c y.cpp
    g++ -shared -o libxxx.so x.o y.o
    或者 g++ -fPIC -shared -o libxxx.so x.cpp y.cpp

  • 静态链接库和动态链接库的各自特点:
    (1)动态库升级程序方便,只要接口不变,无须重新编译
    (2)静态库运行速度快
    (3)动态库有利于进程间资源共享

makefile的编写

常用命令:

  • 定义变量 CC = gcc
  • 引用变量 $(CC)
  • 内部变量
    $@扩展成当前规则的目标文件名
    $<扩展成依靠列表中的一个依赖文件;
    例如,A:B C 那么,A属于目标文件名,B 和C属于依靠文件列表,B 属于第一个依赖文件。
    $^扩展成整个依靠的列表
  • 函数
    $(wildcard PARTERN …) 在Makefile中被展开为已经存在的、使用空格分开的、匹配模式的所有文件列表
    SOURCE=$(wildcard *.c *.cpp)
    $(patsubst(X, Y, Z))包含3个参数,第一个X表示需要匹配的样式,第二个Y表示用什么来替换它,第三个Z表示小处理的由空格分割的列表。
    OBJS = $(patsubst %.c,%.o,$(dir))

  • 配置编译器g++:
    gcc或g++ -Wall 输出所有的警告信息;
    -O 编译时进行优化
    -g 编译debug版本
    -o 编译目标文件名,不写默认:依赖文件名.o
    -c 将文件编译成目标文件
    -fPIC 编译成位置独立的代码。不用此选项,则动态载入时,是位置相关的,通过复制代码的方式来满足不同进程的需要。
    -Lpath 表示在path路径下搜索库文件。如-L.表示当前目录下。
    -Ipath 表示在path路径下搜索头文件
    -l编译器查找库名字,即在名字前加lib,在后面加.so或.a。当动态库和静态库重名的时候,优先查找到动态库,即.so文件。
    -shared 生成动态库

展开阅读全文

没有更多推荐了,返回首页