天天看點

靜态函數庫與動态函數庫(共享庫)的建立

靜态函數庫的建立過程:

(1)生成 *.o檔案;

[[email protected] mine]# ls add.cpp add.h main.cpp sub.cpp sub.h [[email protected] mine]# g++ -o add.o -c add.cpp [[email protected] mine]# ls add.cpp add.h add.o main.cpp sub.cpp sub.h [[email protected] mine]# g++ -o sub.o -c sub.cpp [[email protected] mine]# ls add.cpp add.h add.o main.cpp sub.cpp sub.h sub.o [[email protected] mine]# g++ -o main.o -c main.cpp [[email protected] mine]# ls add.cpp add.h add.o main.cpp main.o sub.cpp sub.h sub.o [[email protected] mine]#

(2)建立靜态函數庫

[[email protected] mine]# ar -cr libaddsub.a add.o sub.o [[email protected] mine]# ls add.cpp add.h add.o libaddsub.a main main.cpp main.o sub.cpp sub.h sub.o [[email protected] mine]#

其中,ar是建立靜态庫的指令, -c表示create, -r表示replace,表示當插入的子產品名已經在庫中存在就替換同名的子產品,若其中的一個子產品在庫中不存在,ar就顯示錯誤資訊,并且不替換其他同名子產品;預設情況下,新的成員增加在庫的末尾!

此刻靜态函數庫已經建立好了,可以安全使用了,使用方法如下所示喔~:~

[[email protected] mine]# g++ -o main main.cpp -L. -laddsub
[[email protected]ocalhost mine]# ls
add.cpp  add.h  add.o  libaddsub.a  main  main.cpp  sub.cpp  sub.h  sub.o
[[email protected] mine]# 
           

此處的-L指定靜态函數庫的位置供查找, “ .”表示在目前目錄下查找;

-l 指定靜态函數庫名, 靜态函數庫名一般為libXXX.a,其中的lib和 .a 被忽略掉;

當靜态函數庫的内容被整合進編譯後的檔案後,即是删除掉靜态函數庫,那個可執行的二進制檔案依然可以運作;如下所示:

[[email protected] mine]# ls
add.cpp  add.h  add.o  libaddsub.a  main  main.cpp  sub.cpp  sub.h  sub.o
[[email protected] mine]# ./main 
a = 
b = 
[[email protected] mine]# rm -f libaddsub.a 
[[email protected] mine]# ./main 
a = 
b = 
[[email protected] mine]# ls
add.cpp  add.h  add.o  main  main.cpp  sub.cpp  sub.h  sub.o
[[email protected] mine]# ./main 
a = 
b = 
[[email protected] 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是連接配接動态庫

[[email protected] mine]# g++ -shared -o libaddsub.so add.cpp sub.cpp 
[[email protected] mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[[email protected] mine]# g++ main -o main.cpp -laddsub
g++: error: main: No such file or directory
[[email protected] mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[[email protected] mine]# g++ -o main main.cpp -laddsub
/usr/bin/ld: cannot find -laddsub
collect2: error: ld returned  exit status
[[email protected] mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[[email protected] mine]# ls
add.cpp  add.h  libaddsub.so  main.cpp  sub.cpp  sub.h
[[email protected] mine]# mv libaddsub.so /lib64/
Display all  possibilities? (y or n)
[[email protected] mine]# mv libaddsub.so /lib64/
[[email protected] mine]# ls
add.cpp  add.h  main.cpp  sub.cpp  sub.h
[[email protected] mine]# g++ -o main main.cpp -laddsub、
/usr/bin/ld: cannot find -laddsub、
collect2: error: ld returned  exit status
[[email protected] mine]# g++ -o main main.cpp -laddsub
[[email protected] mine]# ls
add.cpp  add.h  main  main.cpp  sub.cpp  sub.h
[[email protected] mine]# ./main 
a = 
b = 
[[email protected] mine]# \cp main /root/Desktop/
[[email protected] 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(, );
    b = sub(200, 34);

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

    return ;
}