热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux静态动态链接库的编写和使用

生成和使用动态链接库和静态链接库的Makefile编写 1. 概述 介绍linux下生成和使用动态链接库和静态链接库的Makefile的编写方法。   2. 生成动态链接库的Makefile 首先

生成和使用动态链接库和静态链接库的Makefile编写

1. 概述

介绍linux下生成和使用动态链接库和静态链接库的Makefile的编写方法。

 

2. 生成动态链接库的Makefile

首先要有一个c或c++等工具编写出来的库函数文件,也就是里面写了一堆可以被别的函数调用的函数。比如:

 

aaa.cpp

#include

void pf1(void)

{

   printf(“********\n”);

    return;

}

 

void pf2(void)

{

   printf(“#########\n”);

    return;

}

 

接着要写编译这个函数的Makefile

要把一个文件编译成动态链接库文件需要分两个步骤

第一步:将这个文件编译成.o文件

CPP=c++

CPPFLAGS=-c

$(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o

这里是编译cpp文件,就用的是C++,如果是编译.c文件,就需要使用gcc

第二步:将这个.o文件链接成动态链接库文件

LD=ld

LIB = libaaa.so

$(LD) -shared -o $(LIB) haspapi.o

动态链接库文件的名字一定要以lib开头,后缀是.so

编译中一定要加上-shared,表示是生成动态链接库

 

3. 生成静态链接库

还是使用上面的文件,编写Makefile

同样也是分两步,第一步和上面一样,我直接拷贝过来

第一步:将这个文件编译成.o文件

CPP=c++

CPPFLAGS=-c

$(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o

这里是编译cpp文件,就用的是C++,如果是编译.c文件,就需要使用gcc

第二步:将这个.o文件链接成静态链接库文件

LIB = libaaa.a

AR=ar

(AR) -r $(LIB) aaa.o

静态链接库文件的后缀是.a,同样也是需要以lib开头

 

4. 链接库的使用

首先需要编写一个使用了链接库文件中函数的c或者c++文件

 

bbb.cpp

extern void pf1(void);

extern void pf2(void);

 

int main(void)

{

    pf1();

    pf2();

    return0;

}

 

 

使用链接库,Makefile文件如下:

$(CPP) bbb.cpp -I. -L. -o bbb.o -laaa

这里不分是动态的还是静态的,但是,如果使用动态链接库,运行时需要将aaa.so文件拷贝到/usr/lib下,静态库则不需要。

上面的例子是在redhat9上运行测试过的。

 

PS:由于对C++了解甚少,所以直接用c写得c++文件





推荐阅读
  • 本文深入探讨了在安装PostgreSQL数据库系统时,执行Configure、Make及Make Install命令的具体含义与作用。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • ###问题删除目录时遇到错误提示:rm:cannotremoveusrlocaltmp’:Directorynotempty即使用rm-rf,还是会出现 ... [详细]
  • 本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ... [详细]
  • Pro*C访问Oracle数据库的例子test.pc$cattest.pc#includeEXECSQLINCLUDESQLCA;EXECSQLBEGINDECLARESECTIO ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文介绍了在Makefile及Android.mk文件中添加打印输出信息的方法,并详细解析了Android编译过程中的关键步骤,包括环境变量的设置与编译脚本的执行。 ... [详细]
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • QEMU环境下加载首个Linux驱动模块
    本文介绍了如何在Ubuntu 20.04系统上使用QEMU虚拟机加载一个简单的Linux驱动模块。此过程涉及Linux内核4.0版本的配置与编译。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
author-avatar
mobiledu2502861597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有