http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/
虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
最近在Linux下使用第三方库Protobuf时,遇到一个问题:可执行程序在运行时报错:“error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory”。于是花时间弄清楚原因,找到解决方案,跟大家共享一下。
库的本质上是一个可执行的二进制文件,但是它并不能独立的执行。简单的来说,就相当于一个仓库,把你已经写好的功能函数放到库中,然后后续需要时通过正确的接口去使用相应的功能,当然可以把库分享给别人也很方便。在Linux下分为静态库和共享库(也叫动态库),当然Windows下也有静态库(.lib)和动态库(.dll),这里主要是讲解Linux下的静态库和共享库,以及它们的简单实现。
我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护。我们可以把他们制作成相应的功能函数,使用时直接调用就会很方便,还可以进行后期的功能升级。
在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。
GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。
一、前言 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最
前言:在上一篇我们简单介绍了yum,vim的一些常用的指令和模式,现在让我们来进一步了解其他的Linux环境基础开发工具gcc/g++,gdb。
我们在编写代码的时候经常用到已有的接口,他们是以库的形式提供给我们使用的,而常见形式有两种,一种常以.a为后缀,为静态库;另一种以.so为后缀,为动态库。那么这两种库有什么区别呢?
在C语言 程序员内功心法之程序环境和预处理 博文中,我们就学习到 – 一个程序要被运行起来需要经历四个阶段:预处理 (预编译)、编译、汇编、链接,下面我们来简单回顾一下这四个阶段会进行的操作。
「静态库(.a)」:程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。静态库比较占用磁盘空间,而且程序不可以共享静态库。运行时也是比较占内存的,因为每个程序都包含了一份静态库。
Hello,小伙伴们,大家好!最近有小伙伴问我程序库相关的问题。程序库的存在很大程度上提高了程序的复用性、可维护性,但是程序库的应用往往对于初学者来说有些摸不清头脑,所以这一期本文从Linux的角度谈谈Linux下的程序库。 1. 什么是库 库文件一般就是编译好的二进制文件,用于在链接阶段同目标代码一起生成可执行文件,或者运行可执行文件的时候被加载,以便调用库文件中的某段代码。库文件无法直接执行,因为它的源代码中没有入口主函数,而只是一些函数模块的定义和实现,所以无法直接执行。程序库使程序更加模块化,重新编
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查 无误后,gcc 把代码翻译成汇编语言。
这篇文章主要通过实例演示在Linux下如何使用gcc分别编译生成静态库和动态库文件以及其它程序如何使用这个生成的静态库和动态库。
其实学完C语言的语法后,我们往往会有数不清的疑惑,例如编译器在编译的时候就可以分配内存,那么不同的程序会不会分配到相同的内存地址,计算机如何处理这种冲突?C语言既然可以操作内存,我们能不能修改其他程序的内存数据,游戏外挂是不是这样实现的?程序是怎么被加载到内存的,C语言main函数又是谁调用的?为什么编译之后还要链接?什么是动态库什么又是静态库?
动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。
在说明Linux的.a、.so和.o文件关系之前,先来看看windows下obj,lib,dll,exe的关系。
假设你下载了一款游戏,你是否会跑到游戏所在目录中双击 .exe 打开游戏?答案是不会,大多数人都会通过桌面的快捷方式直接打开文件,而这个快捷方式实际就是对 .exe 的 软链接 文件;当你在游戏中加载地图、道具等资源时,这些数据是存在 .exe 文件中的吗?答案是当然不是,这些资源文件都以 库 的方式与 .exe 位于同一目录中,通常为动态库,在 Windows 中后缀为 dll,那么这些神奇的辅助文件是如何产生的?本文将带你一起揭晓
1、静态库的命名格式 lib + 库的名字 + .a 例:libMyTest.a (MyTest为静态库的名字)
GCC是由GNU开发的编程语⾔编译器,包括C、Cpp、Objective-C、Fortran、Java、Ada、Golang。
1 . 编译 FFMPEG 函数库 : 【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 )
当你在Linux系统上编写和运行程序时,动态库和静态库是两个非常重要的概念。它们不仅影响着程序的编译和执行效率,还直接关系到程序的可移植性和灵活性
更加详细的介绍,可以参照这篇博客:C语言翻译环境:预编译+编译+汇编+链接详解-CSDN博客
例如,用test1.c、test2.c、test3.c、test4.c以及main1.c形成可执行文件,我们需要先得到各个文件的目标文件test1.o、test2.o、test3.o、test4.o以及main1.o,然后再将这写目标文件链接起来,最终形成一个可执行程序。
在C语言中,我们已经学过程序的编译和链接,在这里将复习一下我们之前所学的内容并引出后续gcc/g++的内容。
我们在使用Linux的时候,不禁会有这么一个疑问:为什么我们能够在Linux下进行c/c++代码的编写以及编译呢?这是因为Linux系统默认携带了语言级别的头文件以及语言所对应的库。
关于库相比大家之前肯定使用过,比如C/C++里面的标准库,STL里面的各种库,我们在调用STL里的容器时都需要使用库,那么库到底是什么呢?
随着软件开发的发展,人们发现很多应用的代码是相同的,也就是说这些代码可以被共享,因此,人们提出了静态库和动态库两种方案来解决代码共享的问题。
hello,大家好,今天我们继续学习Linux中的动静态库,我们将从不同的角度来学习如何使用,并如何制作一个可供他人使用的动静态库文件,并试着探究一下动态库加载问题。那我们就开始学习吧!!
我在路径/root/host/my_program/asoc/include下创建四个文件
书接上文,我们已经学习了 Linux 中的编辑器 vim 的相关使用方法,现在已经能直接在 Linux 中编写C/C++代码,有了代码之后就要尝试去编译并运行它,此时就可以学习一下 Linux 中的编译器 gcc/g++ 了,我们一般使用 gcc 编译C语言,g++ 编译C++(当然 g++ 也可编译C语言),这两个编译器我们可以当作一个来学习,因为它们的命令选项都是通用的,只是编译对象不同。除了编译器相关介绍外,本文还会库、自动化构建工具、提权等知识,一起来看看吧
目前网上找到的ios嵌入nodejs介绍,都是指向nodejs-mobile项目,nodejs-mobile对nodejs项目做了一定魔改,可以预想会难以及时的随nodejs升级,该项目目前的nodejs版本12.19.0,比起官方版本落后太多。而本文介绍的办法只需对nodejs的gyp添加少些修改以支持ios、android的编译,该方式编译的16.16.0版本nodejs已经在真机上测试通过并应用到puerts项目上。而且该修改方式也已经提PR给nodejs官方并合入到主干: libnode for ios app embedding
gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。
源码地址为:https://www.openssl.org/source/old/;当前最新版本为 1.1.0f,https://www.openssl.org/source/old/1.1.0/openssl-1.1.0f.tar.gz
当你勤勤恳恳完成需求后,要交付你的成果时,你突然发现了一个问题,如果直接把源代码给乙方,他就可以直接进入你的代码,然后狠狠的学习再“借鉴”,甚至修改,你的头发的产物就被别人盗取了。这该如何是好?
Linux使用静态库来测试,copy静态库libglog.a和src/glog的头文件到自己的工程目录,创建main.cpp文件,添加如下代码:
在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。
今天我们来学习动静态库。我们之前有没有使用过库呢??? 当然了: strerror strstr strcpy memset...等函数都要有具体的实现,那这个具体的实现在哪里呢???就是在我们的库中!
C++静态库与动态库
Linux中的基础开发工具及其使用,包括yum(软件包管理器)、vim(编辑器)、gcc/g++(编译器)、makefile(项目自动化构建工具)、gdb(调试器)等。
Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说,库的整个处理过程简直是个迷。但对有经验的人来说,被构建进操作系统的大量共享代码对于编写新应用来说却是个优点。
FFmpeg是音视频领域绕不过去的开源库,编译FFmpeg是音视频开发的基本功,FFmpeg就像一个音视频开源框架,很多的开源库都像插件一样作为FFmpeg的子模块,例如openssl、x264、x265、fdk-aac等等库都可以通过插件的形式编译进FFmpeg开源项目中。本文主要的目的是介绍一下FFmpeg的编译过程,以及如何将这些插件编译进FFmpeg中。
CMake一个简洁的构建工具,让我们省去了设计复杂的Makefile。在之前作者已经整理了两篇相关文章,如下:
大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python、Ruby、MATLAB 、JavaScript。
头文件拷贝,去注释,条件编译,宏替换 -E让程序翻译到预处理阶段就停下来,-o指明形成的临时文件名称。
我们前面已经学习了使用vim来编写代码,我们也知道了,Linux下的工具都是各自独立的,vim用来编写代码,我们如何执行代码呢?这就需要用到gcc/g++了,那么话不多说,开启我们今天的话题!
领取专属 10元无门槛券
手把手带您无忧上云