Linux 静态库、动态库
静态库
静态库本质就是一个 .o 文件,命名为 libxxx.a
创建静态库:
gcc -c add.c # 默认生成 add.o 文件
gcc -c -o libadd.a add.c # 这就是标准的静态库文件
ar rcs libfun.a add.o mul.o # 使用压缩命令将多个 .o 文件合成一个压缩包
使用静态库:
gcc main.cpp ./libadd.a
gcc -L. main.cpp -ladd # -L.:在当前目录查找静态库 -ladd:等于 ./libadd.a
gcc -static -L. main.cpp -ladd
main.cpp
#include <add.h>
#include <cstdio>
int main(int argc, char const *argv[]) {
std::printf("add %d\n", add(1, 2));
return 0;
}
add.h
#ifndef _ADD_H_
#define _ADD_H_
int add(int, int);
#endif // _ADD_H_
add.cpp
#include <add.h>
int add(int a, int b) { return a + b; }
makefile
cc = g++ -I.
main:main.o add.a
$(cc) -static -o $@ $^
main.o:main.cpp
$(cc) -c -o $@ $^
add.a:add.cpp
$(cc) -c -o $@ $^
.PHONY:clean
clean:
rm *.o *.a main a.out
main.cpp
#include <add.h>
#include <mul.h>
#include <cstdio>
int main(int argc, char const *argv[]) {
std::printf("add %d\n", add(1, 2));
std::printf("mul %d\n", mul(1, 2));
return 0;
}
add.h
#ifndef _ADD_H_
#define _ADD_H_
int add(int, int);
#endif // _ADD_H_
add.cpp
#include <add.h>
int add(int a, int b) { return a + b; }
mul.h
#ifndef _MUL_H_
#define _MUL_H_
int mul(int, int);
#endif // _MUL_H_
mul.cpp
#include <mul.h>
int mul(int a, int b) { return a * b; }
makefile
cc = g++ -I.
main:main.o libmath.a
$(cc) -static -o $@ $^
main.o:main.cpp
$(cc) -c -o $@ $^
libmath.a:add.o mul.o
ar rcs $@ $^
add.o:add.cpp
$(cc) -c -o $@ $^
mul.o:mul.cpp
$(cc) -c -o $@ $^
.PHONY:clean
clean:
rm *.o *.a main a.out
动态库
命名为 libxxx.so
创建动态库
gcc -shared -fpic -o libxxx.so xxx.c yyy.c
# -fpic 生成位置无关代码
# -shared 指示链接器创建一个共享的目标文件
使用动态库
使用动态库的方法与使用静态库的方法相同。
如果在动态库文件和静态库文件同时存在,优先使用动态库编译。
g++ -o main main.cpp -L/usr/local/lib -ldynamic
放置动态库
Linux系统中采用LD_LIBRARY_PATH
环境变量指定动态库文件的目录。在运行程序时要保证动态库文件放在能够扫描到的目录下。
main.cpp
#include <add.h>
#include <mul.h>
#include <cstdio>
int main(int argc, char const *argv[]) {
std::printf("add %d\n", add(1, 2));
std::printf("mul %d\n", mul(1, 2));
return 0;
}
add.h
#ifndef _ADD_H_
#define _ADD_H_
int add(int, int);
#endif // _ADD_H_
add.cpp
#include <add.h>
int add(int a, int b) { return a + b; }
mul.h
#ifndef _MUL_H_
#define _MUL_H_
int mul(int, int);
#endif // _MUL_H_
mul.cpp
#include <mul.h>
int mul(int a, int b) { return a * b; }
makefile
main:main.cpp libmath.so
g++ -I. -o $@ main.cpp -L. -lmath
libmath.so:add.cpp mul.cpp
g++ -I. -fpic -shared -o $@ $^
.PHONY:clean
clean:
rm *.o *.so a.out main