ubantu可執行程式的組裝
一、用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下庫檔案的生成與使用。
相關文章
- (嵌入式)Windows與Ubantu下的C語言程式的編譯執行WindowsC語言編譯
- Ubantu安裝gccGC
- Ubantu 安裝 rabbitMQMQ
- 原程式執行良好,Pyinstaller封裝後執行出錯 的分析封裝
- 修改組策略以安裝MSI程式進行許可權升級或許可權維持
- matlab程式碼轉exe可執行軟體Matlab
- Python程式碼打包成可執行檔案的常用方法!Python
- ELF PHP 可執行程式執行後載入重型指令碼的過程PHP行程指令碼
- electron+puppeteer 封裝成exe可執行檔案封裝
- 將自己的python程式碼打包成exe的可執行檔案Python
- 【Flask】第一個Flask程式(安裝、執行引數、執行方式)Flask
- IDEA打可執行的jar包IdeaJAR
- 瞭解可執行的NPM包NPM
- 最小化可執行產品(MVP)的四大必備模組MVP
- window安裝msi檔案沒有可執行軟體
- 執行緒模組執行緒
- PlayStation Classic已被黑客破解 可執行USB裝置上的遊戲黑客遊戲
- ‘cnpm' 不是內部或外部命令,也不是可執行的程式NPM
- LKRG:用於執行時完整性檢查的可載入核心模組
- ubantu MySQL安裝沒有root密碼的解決方案MySql密碼
- 可本地執行大模型的應用大模型
- Maven打包springboot框架的可執行的jarMavenSpring Boot框架JAR
- Wpf應用程式作為一個單獨的可執行檔案
- Javascript的裝載和執行JavaScript
- Jpackage-製作無需預裝Java環境的Jar可執行程式PackageJavaJAR行程
- saltstack 常用執行模組
- 理解Java程式的執行Java
- 程式執行緒篇——程式執行緒基礎執行緒
- 硬體裝置上能執行小程式嗎?
- 【Maven】構建可執行JarMavenJAR
- 多執行緒系列(十七) -執行緒組介紹執行緒
- 程式-程式-執行緒執行緒
- Python 打包 windows 可執行的 exe 檔案PythonWindows
- 編譯Android下可執行命令的FFmpeg編譯Android
- 一個工程的多個模組中的一個模組打包成jar在轉為.exe可執行檔案JAR
- 漫談計算機組成原理(一)之程式執行的過程計算機
- 多執行緒程式是如何執行程式碼的?執行緒行程
- 新的PHP高危漏洞可導致黑客執行遠端程式碼攻擊PHP黑客