Linux-(C/C++)生成并使用静态库/动态库

  • 静态库/动态库概要

在Windows下静态库的后缀为:.lib、动态库后缀为:.dll;而在Linux下静态库的后缀为:.a、动态库的后缀为:.so。

那么什么是静态库呢?

首先我们来看看程序编译的大体流程:预处理——编译——汇编——链接

在我们的项目开发中,有些代码会被反复使用,那么这时我们便可将这些代码编译成库的形式来调用,像静态库就是在可执行文件中包含库代码的一份完整拷贝,但这种方式有个很严重的缺点就是会造成多份冗余拷贝。静态库会在程序的链接阶段被复制到程序中,所以程序在运行后是不会调用静态库的。

那动态库又是什么呢?

动态库不像静态库那样,在链接阶段并没有被复制到程序中,反而是程序运行的时候由系统动态的加载到内存中供程序调用,所以这里解决了静态库早晨多份冗余拷贝的缺点,系统只需要载入一次动态库,不同的程序可以得到内存中相同的动态库副本,因此可以节省大量的内存。

 

  • 生成静态库/动态库

下面进入主题看看在linux中如何生成静态库跟动态库:

首先我们先创建三个文件,分别为hello.cc、hello.h、main.cc,如下图:

 

“hello.h":

 
  1. #ifndef __HELLO_H__

  2. #define __HELLO_H__

  3.  
  4. #include <stdio.h>

  5.  
  6. void Hello();

  7.  
  8. #endif

"hello.cc":

 
  1. #include "hello.h"

  2.  
  3. void Hello()

  4. {

  5. printf("Hello World!!!\n");

  6. }

"main.cc":

 
  1. #include "hello.h"

  2.  
  3. int main(void)

  4. {

  5. Hello();

  6.  
  7. return 0;

  8. }

这时我们hello world代码算是写完了。接下来我们生成静态库

g++ -o main main.cc -static -lhello -L.

 

我们先简单介绍下"gcc"跟"g++":gcc 最开始的时候是 GNU C Compiler, 如你所知,就是一个c编译器。但是后来因为这个项目里边集成了更多其他不同语言的编译器,GCC就代表 the GNU Compiler Collection,所以表示一堆编译器的合集。 g++则是GCC的c++编译器。

 

此处我们使用g++,如果使用c语言可以将g++改为gcc:

1、将hello.cc编译成hello.o(静态库和动态库都是由.o文件生成)

g++ -c hello.cc

2、为了遵循linux中静态库的命名规范,静态库命名为libhello.a

ar cr libhello.a hello.o

3、将main.cc与静态库连接,生成可执行文件:“main”

g++ -o main main.cc -static -lhello -L.

最后文件如下如:

4、运行可执行文件

./main

下面进行动态库的生成

1、生成动态库libhello.so

 
  1. g++ -c -fPIC hello.cc -o hello.o

  2. g++ -shared hello.o -o libhello.so

当然这里我们可以直接通过cmake来生成动态库,下面我们用cmake的方式生成动态库并链接动态库。

首先我们改造下目录结构:

  

我们删除上一步生成的静态库跟动态库,只保留源代码,在开始的code目录下创建两个文件夹分别是:build、lib;在code跟lib目录下分别创建一个CMakeLists.txt文件(用于编写cmake代码),并在code同级目录下创建code2目录,在该目录下创建build、src目录,将之前的main.cc移到src下,在code2目录跟src目录下创建CMakeLists.txt文件,先来看看code目录下的CMakeLists.txt文件,代码如下:

PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)

lib目录下的CMakeLists.txt文件代码如下:

SET(LIBHELLO_SRC hello.cc)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
INSTALL(TARGETS hello hello
LIBRARY DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)

对上面代码解析下,ADD_LIBRARY用于生成库文件,hello是动态库名(libxxx.x中xxx的名字),SHARED表示生成的库为动态库。之后的INSTALL是安装共享库和头文件,安装到系统库中(/usr/lib跟usr/include/hello目录下,这里的hello文件夹是我自己创建的)。

最后在build目录下运行终端(在执行INSTALL时需要用到root权限,所以在执行make前先切换到root模式下),输入命令行如下:

cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
make install

可以到指定目录中查看库跟头文件已经成功安装到了指定目录下。

下面我们在main.cc中调用我们生成的动态库。

首先我们先将main.cc中引入的头文件#include "hello.h"改为#include <hello.h>;

我们先看看code2目录下的CMakeLists.txt下的脚本:

PROJECT(NEWHELLO)
ADD_SUBDIRECTORY(src)

src目录下的CMakeLists.txt脚本如下:

ADD_EXECUTABLE(main main.cc)
INCLUDE_DIRECTORIES(/usr/include/hello)
TARGET_LINK_LIBRARIES(main libhello.so)

跟上面一样我们在终端下来到build目录,并输入命令行如下:

cmake ..
make

得到的输出为:Hello World!!!

到这里我们链接库的实例就说完了。cmake是个好东西!你值得拥有!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下最好的围棋_学围棋能使学习成绩提高吗?

孩子几岁开始学习围棋最合适&#xff1f;当然要4岁开始学围棋。一是因为&#xff1a;4岁是幼儿形状知觉形成的关键期&#xff0c;围棋千变万化的棋形(见文后图)是最有利于促进与锻炼孩子形状知觉的形成。二是因为&#xff1a;人的大脑在3周岁后基本已经发育了60%&#xff0c;到…

C#与C/C++的交互zz

C#与C交互&#xff0c;总体来说可以有两种方法&#xff1a; 利用C/CLI作为代理中间层 利用PInvoke实现直接调用 第一种方法&#xff1a;实现起来比较简单直观&#xff0c;并且可以实现C#调用C所写的类&#xff0c;但是问题是MONO构架不支持C/CLI功能&#xff0c;因此无法实现脱…

curl查看swift状态命令_HTTP 请求与响应包括哪些,如何用Chrome查看 HTTP 请求与响应内容和curl 命令的使用...

1.HTTP的请求和响应其实就是通过电脑上的软件来进行的&#xff0c;客户端请求的内容发送到服务器上&#xff0c;服务器收到请求后就会响应客户端的请求&#xff0c;如图&#xff1a;HTTP请求的内容及格式&#xff1a;请求最多包含四部分&#xff0c;最少包含三部分。&#xff0…

Pytorch的BatchNorm层使用中容易出现的问题

前言 本文主要介绍在pytorch中的Batch Normalization的使用以及在其中容易出现的各种小问题&#xff0c;本来此文应该归属于[1]中的&#xff0c;但是考虑到此文的篇幅可能会比较大&#xff0c;因此独立成篇&#xff0c;希望能够帮助到各位读者。如有谬误&#xff0c;请联系指出…

android 比较靠谱的图片压缩

2019独角兽企业重金招聘Python工程师标准>>> 第一&#xff1a;我们先看下质量压缩方法&#xff1a; private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, …

常用公差配合表图_ER弹簧夹头配套BT刀柄常用规格型号表

ER弹簧夹头具有定心精度高&#xff0c;夹紧力均匀的特点&#xff0c;广泛用于机械类零件的精加工和半精加工&#xff0c;通常与BT刀柄匹配使用。BT刀柄是是机械主轴与刀具和其它附件工具连接件&#xff0c;BT为日本标准(MAS403)&#xff0c;现在也是普遍使用的一种标准。传统刀…

Linux下python安装升级详细步骤 | Python2 升级 Python3

Linux下python升级步骤 Python2 ->Python3 多数情况下&#xff0c;系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是&#xff0c;现在多数情况下建议使用3.x 那么如何升级呢&#xff1f; 下面老徐详细讲解升级步骤&#xff1b; 首先下载源tar包 可利用linux自带下…

华为手机连电脑_手机、电脑无网高速互传!华为神技逆天

Huawei Share是华为的一项自研多终端传输技术&#xff0c;可以在没有网络状态下实现手机与手机、电脑等多终端设备间快速稳定的文件分享&#xff0c;尤其是在办公场景下&#xff0c;可以极大提升办公效率。华为表示&#xff0c;未来Huawei Share将应用于更多全场景跨设备无缝分…

excel统计行数_值得收藏的6个Excel函数公式(有讲解)

收藏的Excel函数大全公式再多&#xff0c;几天不用也会忘记。怎么才能不忘&#xff1f;你需要了解公式的运行原理。小编今天不再推送一大堆函数公式&#xff0c;而是根据提问最多的问题&#xff0c;精选出6个实用的&#xff0c;然后详细的解释给大家。1、计算两个时间差TEXT(B2…

Studio One正版多少钱 Studio One正版怎么购买

随着版权意识的增强&#xff0c;打击盗版的力度越来越大&#xff0c;现在网络上的盗版资源越来越少&#xff0c;资源少很难找是一方面&#xff0c;另一方面使用盗版软件不仅很多功能不能使用&#xff0c;而且很多盗版软件都被植入各种木马病毒&#xff0c;从而带来各种各样的风…

DNS简述

常见DNS记录SOA&#xff1a;域权威开始NS&#xff1a;权威域名服务器A&#xff1a;主机地址CNAME&#xff1a;别名对应的正规名称MX&#xff1a;邮件传递服务器PTR&#xff1a;域名指针 (用于反向 DNS)查询过程浏览器缓存->hosts->LDNS->LDNS缓存->ISP->ISP缓存…

cuda gpu相关汇总

1.Ubuntu16.04:在anaconda下安装pytorch-gpu 转自&#xff1a;Ubuntu16.04:在anaconda下安装pytorch-gpu_莫等闲996的博客-CSDN博客 1 创建虚拟环境并进入 conda create -n pytorch-gpu python3.6 conda activate pytorch-gpu 2 下载对应的安装包和配件 方法一(推荐)&#…

普通人学python有意义吗_学python难吗

首先&#xff0c;对于初学者来说学习Python是不错的选择&#xff0c;一方面Python语言的语法比较简单易学&#xff0c;另一方面Python的实验环境也比较容易搭建。学习Python需要的时间取决于三方面因素。(推荐学习&#xff1a;Python视频教程)其一是学习者是否具有一定的计算机…

在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

【题外话】 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio&#xff08;NTVS&#xff09;&#xff0c;其提供了非常方便的开发和调试功能&#xff0c;当然很多情况下由于平台限制等原因需要在其他机器上运行程序&#xff0c;进而需要远程调试功能&#xff0c…

服务器定期监控数据_基础设施硬件监控探索与实践

本文选自 《交易技术前沿》总第三十六期文章(2019年9月)陈靖宇深圳证券交易所 系统运行部Email: jingyuchenszse.cn摘要&#xff1a;为了应对基础设施规模不断上升&#xff0c;数据中心两地三中心带来的运维挑战&#xff0c;深交所结合现有基础设施现状&#xff0c;以通用性、灵…

VS2010问题汇总

问题1&#xff1a;error C3872: "0xa0": 此字符不允许在标识符中使用 error C3872: "0xa0": 此字符不允许在标识符中使用 或者 error C3872: 0xa0: this character is not allowed in an identifier 解法&#xff1a;这是因为直接复制代码的问题。0xa0是…

vue如何获取年月日_好程序员web前端教程分享Vue相关面试题

好程序员web前端教程分享Vue相关面试题&#xff0c;Vue是一套构建用户界面的渐进式框架&#xff0c;具有简单易用、性能好、前后端分离等优势&#xff0c;是web前端工程师工作的好帮手&#xff0c;也是企业选拔人才时考察的重点技能。接下来好程序员web前端教程资源就给大家分享…

react dispatch_React系列自定义Hooks很简单

React系列-Mixin、HOC、Render Props(上)React系列-轻松学会Hooks(中)React系列-自定义Hooks很简单(下)我们在第二篇文章中介绍了一些常用的hooks&#xff0c;接着我们继续来介绍剩下的hooks吧useReducer 作为useState 的替代方案。它接收一个形如(state, action) > newStat…

前端 保存后端传来数据的id_一篇来自前端同学对后端接口的吐槽

前言去年的某个时候就想写一篇关于接口的吐槽&#xff0c;当时后端提出了接口方案对于我来说调用起来非常难受&#xff0c;但又说不上为什么&#xff0c;没有论点论据所以也就作罢。最近因为写全栈的缘故&#xff0c;团队内部也遇到了一些关于接口设计的问题&#xff0c;于是开…

2018-2019-1 《信息安全系统设计基础》教学进程

《信息安全系统设计基础》教学进程 目录 考核方式暑假准备教学进程 第01周学习任务和要求第02周学习任务和要求第03周学习任务和要求第04周学习任务和要求第05周学习任务和要求第06周学习任务和要求第07周学习任务和要求第08周学习任务和要求第09周学习任务和要求第10周学习任务…