首页 > 系统相关 >Linux 静态库、动态库

Linux 静态库、动态库

时间:2022-09-07 11:47:59浏览次数:58  
标签:main 静态 int add include Linux cpp mul 动态

静态库

静态库本质就是一个 .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

 

标签:main,静态,int,add,include,Linux,cpp,mul,动态
From: https://www.cnblogs.com/zhh567/p/16664821.html

相关文章

  • linux内核
    Linux系统从应用角度来看,分为内核空间和用户空间两个部分。内核空间是Linux操作系统的主要部分,但是仅有内核的操作系统是不能完成用户任务的。丰富并且功能强大的应用程......
  • Linux系统磁盘扩容
     一、基本概念:逻辑卷管理(LogicalVolumeManager),LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分......
  • Linux 入门
    Linux入门LinuxLinux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思......
  • linux ssh隧道
    linuxssh隧道隧道是一种把一种网络协议封装进另外一种网络协议进行传输的技术。这里我们研究ssh隧道,所以所有的网络通讯都是加密的。又被称作端口转发,因为ssh隧道通常会......
  • linux标准输入输出以及重定向
    1.经常遇到<<<>>>0>&1是什么意思以上表示某种输入输出重定向,具体了解前要知道什么是标准输入输出。2.什么是标准输入输出标准输入输出实际完整的叫法是标准输入......
  • Linux环境搭建
    Linux环境搭建安装VNware虚拟机我在腾讯下载中心直接下载点普通下载就可以了https://pc.qq.com/detail/0/detail_21600.html来到安装目录选择一个自己喜欢的目录主要不......
  • windows远程linux桌面
    centos7为例:1.配置好本地yum源,然后安装上 tigervnc 和 tigervnc-server 安装包,被远程只装tigervnc-server即可[root@nginx~]#yumsearchtigervnc--showduplica......
  • 微信小程序picker动态数据,支持picker和文本同时使用
    效果图  如果按钮下没有内容会直接输出结果wxml<viewclass="tr"><viewstyle="width:30%;text-align:center;"wx:for="{{buildinglist}}"wx:for-index="i"......
  • Linux 后台开发必知的 I/O 优化知识总结
      IO性能对于一个系统的影响是至关重要的。一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到IO。而IO性能的发展,明显落后于CPU的发......
  • 深入理解 Linux的 I/O 系统
      传统的SystemCallI/O在Linux系统中,传统的访问方式是通过write()和read()两个系统调用实现的,通过read()函数读取文件到到缓存区中,然后通过write()方法......