linux 生成和使用动态链接库和静态链接库的Makefile编写
?
引用
Jesse Rei 的 linux 生成和使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的Makefile編寫(xiě)生成和使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的Makefile編寫(xiě)
1. 概述
介紹linux下生成和使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的Makefile的編寫(xiě)方法。
?
2. 生成動(dòng)態(tài)鏈接庫(kù)的Makefile
首先要有一個(gè)c或c++等工具編寫(xiě)出來(lái)的庫(kù)函數(shù)文件,也就是里面寫(xiě)了一堆可以被別的函數(shù)調(diào)用的函數(shù)。比如:
?
aaa.cpp
#include <stdio.h>
void pf1(void)
{
??? printf(“********\n”);
??? return;
}
?
void pf2(void)
{
??? printf(“#########\n”);
??? return;
}
?
接著要寫(xiě)編譯這個(gè)函數(shù)的Makefile
要把一個(gè)文件編譯成動(dòng)態(tài)鏈接庫(kù)文件需要分兩個(gè)步驟
第一步:將這個(gè)文件編譯成.o文件
CPP=c++
CPPFLAGS=-c
$(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o
這里是編譯cpp文件,就用的是C++,如果是編譯.c文件,就需要使用gcc
第二步:將這個(gè).o文件鏈接成動(dòng)態(tài)鏈接庫(kù)文件
LD=ld
LIB = libaaa.so
$(LD) -shared -o $(LIB) haspapi.o
動(dòng)態(tài)鏈接庫(kù)文件的名字一定要以lib開(kāi)頭,后綴是.so
編譯中一定要加上-shared,表示是生成動(dòng)態(tài)鏈接庫(kù)
?
3. 生成靜態(tài)鏈接庫(kù)
還是使用上面的文件,編寫(xiě)Makefile
同樣也是分兩步,第一步和上面一樣,我直接拷貝過(guò)來(lái)
第一步:將這個(gè)文件編譯成.o文件
CPP=c++
CPPFLAGS=-c
$(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o
這里是編譯cpp文件,就用的是C++,如果是編譯.c文件,就需要使用gcc
第二步:將這個(gè).o文件鏈接成靜態(tài)鏈接庫(kù)文件
LIB = libaaa.a
AR=ar
(AR) -r $(LIB) aaa.o
靜態(tài)鏈接庫(kù)文件的后綴是.a,同樣也是需要以lib開(kāi)頭
?
4. 鏈接庫(kù)的使用
首先需要編寫(xiě)一個(gè)使用了鏈接庫(kù)文件中函數(shù)的c或者c++文件
?
bbb.cpp
extern void pf1(void);
extern void pf2(void);
?
int main(void)
{
??? pf1();
??? pf2();
??? return 0;
}
?
?
使用鏈接庫(kù),Makefile文件如下:
$(CPP) bbb.cpp -I. -L. -o bbb.o -laaa
這里不分是動(dòng)態(tài)的還是靜態(tài)的,但是,如果使用動(dòng)態(tài)鏈接庫(kù),運(yùn)行時(shí)需要將aaa.so文件拷貝到/usr/lib下,靜態(tài)庫(kù)則不需要。
上面的例子是在redhat9上運(yùn)行測(cè)試過(guò)的。
?
PS:由于對(duì)C++了解甚少,所以直接用c寫(xiě)得c++文件
總結(jié)
以上是生活随笔為你收集整理的linux 生成和使用动态链接库和静态链接库的Makefile编写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ChatGPT将在美推订阅服务:月费20
- 下一篇: (Z) Linux与BSD之间的10个不