静态函数库与动态函数库(共享库)的创建

静态函数库的创建过程:

(1)生成 *.o文件;

[root@localhost mine]# ls
add.cpp add.h main.cpp sub.cpp sub.h
[root@localhost mine]# g++ -o add.o -c add.cpp
[root@localhost mine]# ls
add.cpp add.h add.o main.cpp sub.cpp sub.h
[root@localhost mine]# g++ -o sub.o -c sub.cpp
[root@localhost mine]# ls
add.cpp add.h add.o main.cpp sub.cpp sub.h sub.o
[root@localhost mine]# g++ -o main.o -c main.cpp
[root@localhost mine]# ls
add.cpp add.h add.o main.cpp main.o sub.cpp sub.h sub.o
[root@localhost mine]#

(2)创建静态函数库

[root@localhost mine]# ar -cr libaddsub.a add.o sub.o
[root@localhost mine]# ls
add.cpp add.h add.o libaddsub.a main main.cpp main.o sub.cpp sub.h sub.o
[root@localhost mine]#

其中,ar是创建静态库的命令, -c表示create, -r表示replace,表示当插入的模块名已经在库中存在就替换同名的模块,若其中的一个模块在库中不存在,ar就显示错误信息,并且不替换其他同名模块;默认情况下,新的成员增加在库的末尾!

此刻静态函数库已经创建好了,可以安全使用了,使用方法如下所示喔~:~

[root@localhost mine]# g++ -o main main.cpp -L. -laddsub
[root@localhost mine]# ls
add.cpp  add.h  add.o  libaddsub.a  main  main.cpp  sub.cpp  sub.h  sub.o
[root@localhost mine]# 

此处的-L指定静态函数库的位置供查找, “ .”表示在当前目录下查找;
-l 指定静态函数库名, 静态函数库名一般为libXXX.a,其中的lib和 .a 被忽略掉;

当静态函数库的内容被整合进编译后的文件后,即是删除掉静态函数库,那个可执行的二进制文件依然可以运行;如下所示:

[root@localhost mine]# ls
add.cpp  add.h  add.o  libaddsub.a  main  main.cpp  sub.cpp  sub.h  sub.o
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# rm -f libaddsub.a 
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# ls
add.cpp  add.h  add.o  main  main.cpp  sub.cpp  sub.h  sub.o
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# 

动态函数库的创建:

(1)动态链接方法

(1)g++ -shared -o libaddsub.so add.cpp sub.cpp
生成动态库文件libaddsub.so

(2)要先将生成的.so文件加入到 /lib64中,因为动态函数库被使用时,会先在/lib64下查找动态函数库;

(3)将libaddsub.so加入到/lib64后才能生成可执行二进制文件
g++ -o main main.cpp -laddsub
-laddsub是连接动态库

[root@localhost mine]# g++ -shared -o libaddsub.so add.cpp sub.cpp 
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# g++ main -o main.cpp -laddsub
g++: error: main: No such file or directory
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# g++ -o main main.cpp -laddsub
/usr/bin/ld: cannot find -laddsub
collect2: error: ld returned 1 exit status
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[root@localhost mine]# mv libaddsub.so /lib64/
Display all 2437 possibilities? (y or n)
[root@localhost mine]# mv libaddsub.so /lib64/
[root@localhost mine]# ls
add.cpp  add.h  main.cpp  sub.cpp  sub.h
[root@localhost mine]# g++ -o main main.cpp -laddsub、
/usr/bin/ld: cannot find -laddsub、
collect2: error: ld returned 1 exit status
[root@localhost mine]# g++ -o main main.cpp -laddsub
[root@localhost mine]# ls
add.cpp  add.h  main  main.cpp  sub.cpp  sub.h
[root@localhost mine]# ./main 
a = 66
b = 166
[root@localhost mine]# \cp main /root/Desktop/
[root@localhost mine]# 

(2)动态加载方法

以下是所有的源代码:

//add.h
#pragma once

int add(int x, int y);



//add.cpp
#include "add.h"

int add(int x, int y)
{
    return (x + y);
}


//sub.h #pragma once int sub(int a, int b);



//sub.cpp #include "sub.h" int sub(int a, int b) {
    return (a - b);
}


//main.cpp
#include <iostream>

#include "add.h"
#include "sub.h"

using namespace std;

int main()
{
    int a, b;

    a = add(23, 43);
    b = sub(200, 34);

    cout <<"a = " << a << endl;
    cout <<"b = " << b << endl;

    return 0;
}

你可能感兴趣的:(动态库,动态加载,静态库,动态链接)