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 安裝 rabbitMQMQ
- Ubantu安裝gccGC
- ubantu安裝mysqlMySql
- matlab gui 生成獨立可執行的程式MatlabGUI
- 修改組策略以安裝MSI程式進行許可權升級或許可權維持
- 多執行緒-執行緒組的概述和使用執行緒
- buildapp 生成獨立可執行lisp程式UILDAAPPLisp
- cmd執行命令時:不是內部或外部命令,也不是可執行的程式
- 關於在DOS下可執行檔案中裝入或執行一些程式 (2千字)
- 原程式執行良好,Pyinstaller封裝後執行出錯 的分析封裝
- Java多執行緒16:執行緒組Java執行緒
- electron+puppeteer 封裝成exe可執行檔案封裝
- matlab程式碼轉exe可執行軟體Matlab
- 使用原生Java程式碼生成可執行Jar包JavaJAR
- ELF PHP 可執行程式執行後載入重型指令碼的過程PHP行程指令碼
- 瞭解可執行的NPM包NPM
- PlayStation Classic已被黑客破解 可執行USB裝置上的遊戲黑客遊戲
- Python程式碼打包成可執行檔案的常用方法!Python
- Java執行exe,bat等可執行檔案JavaBAT
- ubantu MySQL安裝沒有root密碼的解決方案MySql密碼
- window安裝msi檔案沒有可執行軟體
- 【Flask】第一個Flask程式(安裝、執行引數、執行方式)Flask
- 將Python程式打包成可執行檔案薦Python
- C++程式怎樣呼叫exe可執行檔案C++
- 將自己的python程式碼打包成exe的可執行檔案Python
- 多執行緒系列(十七) -執行緒組介紹執行緒
- ‘cnpm' 不是內部或外部命令,也不是可執行的程式NPM
- 2、編寫/修改許可權及執行Shell程式的步驟
- windows下打包java程式為帶jre的可執行檔案WindowsJava
- 'findstr' 不是內部或外部命令,也不是可執行的程式
- 不安裝.net framework框架執行.Net 程式的方法<收藏>Framework框架
- IDEA打可執行的jar包IdeaJAR
- dddsample一個可執行的例項
- Linux可執行的檔案(轉)Linux
- 可本地執行大模型的應用大模型
- 封裝的可執行於winform與web的Log4Net的類庫封裝ORMWeb
- win32 單例項程式執行-無視窗程式也可Win32單例