动态链接库及静态链接库的编译和使用

假设有三个文件 test26-dynamicLink.h test26-dynamicLink.cc test26-main.cc

/*test26-dynamicLink.h*/
void hello();
/*test26-dynamicLink.cc*/
#include 
void hello(void)
{ 
	printf("Hello, library world!\n");
	printf("upgrade dynamic library!\n");
}
/*test26-dynamicLink.cc*/
#include "test26-dynamicLink.h"
int main(void)
{
	hello();
	return 0;
}
动态链接库编译过程
  1. 编译目标文件
    g++ -g -Wall -fPIC -c test26-dynamicLink.cc -o test26-dynamicLink.o
    -g 生成默认格式的调试信息
    -Wall 显示所有警告
    -fPIC 产生与位置无关代码(Position-Independent Code)
  2. 生成动态链接库
    g++ -shared -Wl,-soname,libtest26.so.0 -o libtest26.so.0.0.1 test26-dynamicLink.o
    -Wl,<> 将逗号分隔的 <选项> 传递给链接器ld
    -soname 指定了动态库的soname(简单共享名,Short for shared object name)
    readelf -d 命令可查看链接库动态段的信息 | grep soname
  3. 建立软连接libtest26.so
    ln -s libtest26.so.0.0.1 libtest26.so
  4. 生成可执行程序
    g++ -g -Wall test26-main.cc -o t26 -ltest26 -L.
    ld程序会自动根据-ltest26到.目录下找libtest26.so文件,然后链接到可执行程序。
  5. 建立软连接libtest26.so.0
    readelf -d t26 可以看到需要[libtest26.so.0], 因此需要建立软连接
    Dynamic section at offset 0xe18 contains 25 entries:
    Tag Type Name/Value
    0x0000000000000001 (NEEDED) Shared library: [libtest26.so.0]
    0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
    ln -s libtest26.so.0.0.1 libtest26.so.0 或者
    ln -s libtest26.so libtest26.so.0
  6. 执行程序
$ ./t26
Hello, library world!
upgrade dynamic library!

如果动态链接库需要升级,用生产新的.so文件后,把软连接重新链接到新的.so文件即可。

静态链接库编译过程

静态链接库编译相对简单

  1. 静态库创建
    ar crs libtest26.a test26-dynamicLink.o
  2. 使用
    gcc -static test26-main.cc -ltest26 -L. -o t26_a
    或者直接使用
    gcc -static test26-main.cc -ltest26 -L. -o t26_a
  3. 执行程序不依赖于.a静态链接库文件

查看静态库中的文件

$ ar -t libtest26.a
test26-dynamicLink.o

https://www.cnblogs.com/lidabo/p/4376708.html
http://emb.hqyj.com/Column/Column754.htm

你可能感兴趣的:(C++,计算机原理)