ubantu可執行程式的組裝

直至植發表於2020-10-13


一、用gcc生成靜態庫和動態庫

(1)編輯生成程式 hello.h、hello.c 和 main.c
在這裡插入圖片描述
hello.h:

#ifndef HELLO_H 
#define HELLO_H 
void hello(const char *name); 
#endif //HELLO_H

hello.c:

#include <stdio.h> 
void hello(const char *name) 
{printf("Hello %s!\n", name); }

main.c:

#include "hello.h" 
int main() 
{hello("everyone"); return 0; }

(2) 將 hello.c 編譯成.o 檔案
輸入如下命令

# gcc -c hello.c

利用ls命令進行檢視是否生成了 hello.o 檔案

在這裡插入圖片描述

`(3) 由.o 檔案建立靜態庫
輸入如下命令

# ar -crv libmyhello.a hello.o

利用ls命令進行檢視是否生成了 libmyhello.a 檔案在這裡插入圖片描述

(4) 在程式中使用靜態庫
輸入如下命令

# gcc -o hello main.c -L. –lmyhello

顯示如下:在這裡插入圖片描述
這是因為自定義的庫時,並非系統的庫。
再輸入如下命令

#gcc main.c libmyhello.a -o hello
# ./hello

顯示如下:
在這裡插入圖片描述
或者輸入如下命令:
先生成 main.o:

gcc -c main.c

再生成可執行檔案:

gcc -o hello main.o libmyhello.a
# ./hello

顯示如下:
在這裡插入圖片描述
刪除靜態庫檔案驗證公用函式 hello 是否真的連線到目標檔案 hello 中,過程如下:
輸入如下命令

# rm libmyhello.a rm: remove regular file `libmyhello.a'? y # ./hello

在這裡插入圖片描述
(5) 由.o 檔案建立動態庫檔案
輸入如下命令

# gcc -shared -fPIC -o libmyhello.so hello.o

在這裡插入圖片描述
由於本人用的是ubuntu16,從hello.c 生成 hello.o,需要將 gcc -c hello.c 換成 gcc -fpic -c hello.c之後才不會出錯,如下:
在這裡插入圖片描述
(6)在程式中使用動態庫

# gcc -o hello main.c -L. -lmyhello

在這裡插入圖片描述
此時出錯提示找不到動態庫檔案 libmyhello.so
解決方法是將檔案 libmyhello.so 複製到目錄/usr/lib 中再來一次,如下:在這裡插入圖片描述此時需要管理員許可權,即需要輸入密碼即可。

(7)當靜態庫和動態庫同名時驗證GCC使用靜態庫還是動態庫如下:
先刪除除.c 和.h 外的所有檔案,再輸入命令

在這裡插入圖片描述此時需要管理員許可權,即需要輸入密碼即可。

再來建立靜態庫檔案 libmyhello.a 和動態庫檔案 libmyhello.so

# gcc -c hello.c
# ar -cr libmyhello.a hello.o 
# gcc -shared -fPIC -o libmyhello.so hello.o 

執行 gcc 命令來使用函式庫 myhello 生成目 標檔案 hello,並執行程式 hello
輸入命令

# gcc -o hello main.c -L. –lmyhello

顯示如下:
在這裡插入圖片描述
此時所遇到的問題解決方法與上一步第六步相同,不再贅述。

二、靜態庫.a與.so庫檔案的生成與使用

(1)編輯生成所需要的四個檔案 A1.c 、 A2.c、 A.h、 test.c
在這裡插入圖片描述
A1.c:

#include <stdio.h> 
void print1(int arg)
{ printf("A1 print arg:%d\n",arg); }

A2.c:

#include <stdio.h> 
void print2(char *arg)
{ printf("A2 printf arg:%s\n", arg); }

A.h:

#ifndef A_H 
#define A_H 
void print1(int); 
void print2(char *); 
#endif

test.c:

#include <stdlib.h>
#include "A.h" 
int main()
{ print1(1); print2("test"); exit(0); }

(2) 靜態庫.a 檔案的生成與使用
生成目標檔案(xxx.o)

# gcc -c A1.c A2.c

顯示如下:
在這裡插入圖片描述
生成靜態庫.a 檔案

# ar crv libafile.a A1.o A2.o

顯示如下:
在這裡插入圖片描述
使用.a 庫檔案,建立可執行程式

# gcc -o test test.c libafile.a
#./test

顯示如下:
在這裡插入圖片描述
(3)共享庫.so 檔案的生成與使用
生成目標檔案(xxx.o)

# gcc -fpic -c hello.c
# gcc -c -fpic A1.c A2.c

顯示如下:
在這裡插入圖片描述
生成共享庫.so 檔案

# gcc -shared -fpic -o  libsofile.so A1.o A2.o

使用.so 庫檔案,建立可執行程式

# gcc -o test test.c libsofile.so
# ./test

顯示如下:
在這裡插入圖片描述
出現錯誤,是找不到對應的.so 檔案
執行 ldd test,檢視連結情況

# ldd test

顯示如下:在這裡插入圖片描述
此時需將對應 so 檔案拷貝到對應路徑

sudo cp libsofile.so /usr/lib

顯示如下:
在這裡插入圖片描述

三、自主設計一個靜態庫的連結

(1)編輯生成所需要的四個g檔案 sub1.c 、 sub2.c、 sub1.h、 main1.c在這裡插入圖片描述
sub1.c:

#include"sub1.h"
float x2x(int a,int b)
{
return a+b;
}

sub2.c:

#include"sub1.h"
float y2y(int a,int b)
{
return a*b;
}

sub1.h:

float x2x(int a,int b);
float y2y(int a,int b);

main1.c:

int main()
{
int a,b;  
float c,d;
a=1;
b=2;
c=x2x(a,b); //呼叫自定義標頭檔案裡的x2x函式
d=y2y(a,b); //呼叫自定義標頭檔案裡的y2y函式
printf("%f\n%f\n",c,d);
}

(2) 靜態庫.a 檔案的生成與使用
生成目標檔案(sub1.o、sub2.o)

# gcc -c sub1.c sub2.c

顯示如下:在這裡插入圖片描述
生成靜態庫.a 檔案

# ar crv libsubfile.a sub1.o sub2.o

顯示如下:
在這裡插入圖片描述
使用.a 庫檔案,建立可執行程式

# gcc -o main1 main1.c libsubfile.a
#./main1

顯示如下:
在這裡插入圖片描述

總結

本篇文章主要介紹了簡單的ubantu下庫檔案的生成與使用。

相關文章