在LINUX 下安装个啥,都要涉及到编译,尤其是开源软件. 那么编译就涉及到C/C++ 和对应的库. 我们理一理之间的关系有助于MYSQL8源码编译

libc glibc  libc++ libstdc++ eglibc GCC G++ CMakeGDB

从libc说起。

libc是Linux下原来的标准C库,也就是当初写hello world时包含的头文件#include < stdio.h> 定义的地方。

后来逐渐被glibc取代,也就是传说中的GNU C Library,在此之前除了有libc,还有klibc,uclibc。

现在只要知道用的最多的是glibc就行了,主流的一些linux操作系统如 Debian, Ubuntu,Redhat等用的都是glibc

那glibc都做了些什么呢?glibc是Linux系统中最底层的API,几乎其它任何的运行库都要依赖glibc。

glibc最主要的功能就是对系统调用的封装,你想想看,你怎么能在C代码中直接用fopen函数就能打开文件?

打开文件最终还是要触发系统中的sys_open系统调用,而这中间的处理过程都是glibc来完成的。

除了封装系统调用,glibc自身也提供了一些上层应用函数必要的功能,如string,malloc,stdlib,linuxthreads,locale,signal等等。

还有一个glib看起来也很相似,那它又是什么呢?glib也是个c程序库,不过比较轻量级,glib将C语言中的数据类型统一封装成自己的数据类型,提供了C语言常用的数据结构的定义以及处理函数,有趣的宏以及可移植的封装等.

(注:glib是可移植的,说明你可以在linux下,也可以在windows下使用它)。

那它跟glibc有什么关系吗?其实并没有,除非你的程序代码会用到glib库中的数据结构或者函数,这里强调一点,在你准备更换/升级这些库之前,你应该好好思考一下,你真的要更换/升级吗?你要知道你自己在做什么!

你要时刻知道glibc的影响有多大,不管你之前部署的什么程序,linux系统的ls,cd,mv,ps等等全都得依赖它,很多人在更换/升级都有过惨痛的教训,甚至让整个系统奔溃无法启动。所以,强烈不建议更换/升级这些库!

当然如果你写的是C++代码,还有两个库也要非常重视了,libc++/libstdc++,这两个库有关系吗?有。两个都是C++标准库。libc++是针对clang编译器特别重写的C++标准库,那libstdc++自然就是gcc的事儿了。

再说说libstdc++,glibc的关系。libstdc++与gcc是捆绑在一起的,也就是说安装gcc的时候会把libstdc++装上。那为什么glibc和gcc没有捆绑在一起呢?

相比glibc,libstdc++虽然提供了c++程序的标准库,但它并不与内核打交道。对于系统级别的事件,libstdc++首先是会与glibc交互,才能和内核通信。相比glibc来说,libstdc++就显得没那么基础了。

说完了这些库,这些库最终都是拿来干嘛的?当然是要将它们与你的程序链接在一起!这时候就不得不说说gcc了。

你写的C代码.c文件通过gcc首先转化为汇编.S文件,之后汇编器as将.S文件转化为机器代码.o文件,生成的.o文件再与其它.o文件,或者之前提到的libc.so.6库文件通过ld链接器链接在一块生成可执行文件。当然,在你编译代码使用gcc的时候,gcc命令已经帮你把这些细节全部做好了。

那g++是做什么的? 慢慢说来,不要以为gcc只能编译C代码,g++只能编译c++代码。后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。在编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,需要这样,gcc -lstdc++, 所以如果你的Makefile文件并没有手动加上libstdc++库,一般就会提示错误,要求你安装g++编译器了。

另外eglibc是嵌入式编程的系统库

Make工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:编写 CMake 配置文件 CMakeLists.txt 。

执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile.txt

ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。。其中, PATH 是 CMakeLists.txt 所在的目录。

使用 make 命令进行编译。

UNIX及UNIX-like下的调试工具

一般来说,GDB主要帮助你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

总结下:

我们只要记住  glibc  glib  libstdc++ GCC G++ CMakeGDB

glibc        是系统C库 不可更新

glib          是C语言移植库

libstdc++ 是C++语言的标准库

GCC         是C语言编译器

G++         是C++语言编译器

cmake     是编译配置工具

GDB        是调试工具

LINUX C语言的多线程POSIX

C++编译经验小结

GCC编译链接参数

LINUX LIBXXX.SO NOT FOUND

linux c++ 编译 库,LINUX C/C++ 编译库关系相关推荐

  1. Linux下gcc编译中关于头文件与库文件搜索路径相关问题

    如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...

  2. linux c 如何编译静态库,Linux C 编程入门之一:gcc 编译动态库和静态库

    主调用程序源代码3-1:main.c /** * main.c */ #include #include #include "hello_fn.h" int main () { h ...

  3. 编译高性能linux so库,关于如何在linux环境下生成a库和so库(改,附图)-Go语言中文社区...

    一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要i ...

  4. linux调用qt生成静态库文件下载,Centos7下编译openssl静态库与QT引用

    1.下载openssl版本:https://www.openssl.org/source/old/ 下载地址 2.我们下载版本为:openssl-1.0.2k 3.拷贝到Linux服务器任意目录 4. ...

  5. linux下编译libuv,linux下libuv库安装教程

    下载并编译libuv libuv需要自己手动下载源码,并手动编译. 当前目录为:/home/xlz/test/github/,在后面,会用$PATH来代替,我的系统的Debian8,64bit. $g ...

  6. Linux 编译运行查找头文件和库的顺序

    linux中在使用gcc进行编译时,可能会出现找不到相应库或头文件的情况,往往让人十分头疼.因此,此文描述了库和头文件的查找顺序和一些注意事项,希望能帮助大家在出错时能够快速定位和解决. 头文件 gc ...

  7. Linux c编译库路径,【一点一点学Linux C】交叉编译时候如何配置连接库的搜索路径...

    交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,/lib两个目录.因此,在交叉编译的时候,要采取一些方法使得在 ...

  8. linux c的连接库和怎么同时编译多个源程序

    1.理解库函数 库函数有头文件和库文件(so 或者 a)的集合 1)头文件的默认目录 /usr/include 2)库文件的默认目录 /user/lib 3)linux的库文件分为动态连接库(.so) ...

  9. Linux编译soci库,Soci库linux下的编译方法

    Soci库的linux编译方法 1.下载soci库源码 2.在目标机器上配置数据库环境 以oracle为例:(其他数据库只需要简单安装客户端即可) A)下载oracle客户端安装包 oracle-in ...

最新文章

  1. 什么数字万用表可以测量噪声?
  2. UA MATH563 概率论的数学基础 鞅论初步10 Doob可选停止定理与一维随机游走的exiting time
  3. WEB前端 vue学习二 组件之间的数据传递
  4. Linux 环境变量设置及查看
  5. 在yuv域如何降低画面亮度_家庭影院投影机错误地调节了亮度和对比度会得到怎么样的画面?...
  6. AndroidStudio安卓原生开发_Activity的概念和简单使用_创建Activity_创建Layout资源文件_给Activity引入资源Id---Android原生开发工作笔记80
  7. 写给自己--70年代的程序员
  8. Node.js相关——CommonJS规范
  9. 软考 - 软件设计师 - 完整知识点笔记 - 按考频整理
  10. iOS:error: unable to read input file
  11. ESP8266+blinker测温湿度
  12. Hive实战之视频网站数据分析
  13. 关于个人目标的一篇博客
  14. 实现一下模式识别(三)FLD
  15. HCS12XEP100 ATD模块定时中断采样
  16. python脚本windows环境下权限问题处理
  17. 大麦网信息泄露致用户被骗 承认存在技术漏洞
  18. yolov5在线检测目标检测网页实时识别python目标检测flask
  19. 英语语法5-现在完成时
  20. 风控系统案例:中国移动

热门文章

  1. 二十一世纪Windows简史
  2. Ubuntu下使用AMD APP编写OpenCL程序
  3. 视频领域的Instagram:Viddy用户突破2600万
  4. 强烈推荐给从事IT业的同行们 (转载)
  5. 多媒体音频格式解析WMA WAV OGG AAC APE FLAC
  6. FreeSql (四)实体特性 Fluent Api
  7. Linux快速计算MD5和Sha1命令
  8. 关于resolve非泛型方法不能与类型实参一起使用
  9. 树形列(无限级联下拉列的曲线版本)
  10. 对 makefile 中 override 优先级的学习体会