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

 

posted @ 2022-09-07 11:35  某某人8265  阅读(44)  评论(0编辑  收藏  举报