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

66fb6f41595788ae5629ec3eb9360852.png

在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

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

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

相关文章

Linux_学习_Day3_bash

Shell bash是外部程序&#xff1a;type/whichis bash。 shell&#xff0c; 子shell。可以利用bash打开另一个bash。即打开一个子shell。并且每个进程是独立存在的。对于子shell而言&#xff0c;bash并不认知其他bash的存在。 执行了多次bash&#xff0c;要退出只需exit。用pst…

mysql 之 优化 (收集于网络)

&#xff08;以下内容均来自于网络&#xff0c;如果有版权限制&#xff0c;请联系我0.0&#xff09; Mysql存储千亿级的数据&#xff0c;是一项非常大的挑战。Mysql单表可以存储10亿级的数据&#xff0c;只是这个时候性能非常差&#xff0c;项目中大量的实验证明&#xff0c;M…

hadoop-09-安装资源上传

hadoop-09-安装资源上传 在/software/www/html 下面上传 ambari HDP HDP-UTILS-1.1.0.21 文件&#xff0c;之后解压&#xff1b;

easyui 收费_收费班长喻玉华三尺岗亭献青春

- 2020 第四期 人物访谈报道 -拼搏人生最美励志先锋人物专访2013年&#xff0c;22岁的她来到巴南高速这个大家庭中&#xff0c;成为恩阳收费站一名普通的收费员。怀着对事业的执着追求与热爱&#xff0c;经过两年不懈的努力&#xff0c;获得了领导和同事的认可和喜爱。2015年5月…

编程技术面试的五大要点

&#xff08;写在前面的话&#xff1a;本文最初发表于《程序员》杂志2011年10月刊&#xff0c;并收录到《剑指Offer——名企面试官精讲典型编程题》一书中。&#xff09; 近年来找工作一直是一个很热门的话题。我们要想找到心仪的工作&#xff0c;难免需要经过很多轮面试。编程…

访问linux服务主机,如何把Linux配置为日志服务主机。

如网络设备很多&#xff0c;可把同类的设备配置为相同的设备号例&#xff1a;more switch.log | grep X.X.X.X //查看某一设备的日志审核和记录系统的事件是非常重要的。如果仅仅把系统事件作为日志记录下来&#xff0c;而不去查看&#xff0c;还是无济于事。可用webadmin管理和…

WSARecv() 函数使用解析

详情参考&#xff1a;https://msdn.microsoft.com/en-us/library/windows/desktop/ms741688(vvs.85).aspx 简述 The WSARecv function receives data from a connected socket or a bound connectionless socket. The WSARecv function provides some additional features comp…

获取 docker 容器(container)的 ip 地址

获取单个IP docker inspect --format {{ .NetworkSettings.IPAddress }} <container-ID> 获取所有容器IP docker inspect -f {{.Name}} - {{.NetworkSettings.IPAddress }} $(docker ps -aq)转载于:https://www.cnblogs.com/Tempted/p/7774789.html

山西台达plc可编程控制器_可编程控制器2(PLC)控制原理

采用继电器控制采用PC控制PC的控制原理(继电器PC控制)a)当SB1按下&#xff0c;输入继电器00000的线圈通电&#xff0c;00000的常开触点闭合&#xff0c;使得输出继电器01000的线圈得电&#xff0c;01000对应的硬输出触电闭合&#xff0c;KM1得电M1开始运转&#xff0c;同时0100…

一篇读懂 可转债

可转债兴起的原因 可转债是1992年底开始进入中国证券市场的&#xff0c;到现在已经27个年头了。可以说&#xff0c;以前可转债在中国证券市场一直不是市场的焦点和幸运儿&#xff0c;始终没能成为一个上规模的可配置的投资品种——其原因很简单&#xff0c;因为相对而言企业发…

bodhi linux 安装 ubuntu软件,Bodhi Linux 5.1.0 发布,基于Ubuntu的轻量级发行版

Bodhi Linux是基于Ubuntu的轻量级发行版&#xff0c;具有Moksha桌面环境。现在有很多Linux发行版。有些是独特的&#xff0c;但很多是重复的&#xff0c;可能没有存在的必要。由于使用了Moksha桌面环境&#xff0c;一个基于Linux的操作系统Bodhi脱颖而出。如果你不熟悉Bodhi&am…

谈一谈周公所理解的面试

因为公司最近招聘的力度很大&#xff0c;所以最近公司的面试很多&#xff0c;加之很多同事项目紧&#xff0c;所以让我参加了一些技术面试。不论是作为面试官还是应聘者&#xff0c;参加工作以来我参与的面试的次数我自己也记不清了&#xff0c;所以在此想从面试官和应聘者的角…

idc机房运维巡检_智和信通赋能国产信创 建设IT智能监控运维体系 - 蔚颖willing...

作为信创领域深耕多年的企业&#xff0c;北京智和信通技术有限公司始终坚持研发自主知识产权的IT智能运维监控大数据分析系统——智和网管平台SugarNMS&#xff0c;积极探索AIOps智能运维&#xff0c;通过“国产安全监控分析安管日志运维开发”七合一模式&#xff0c;赋能IDC数…

long long or int

long long or int 很多时候long long爆空间&#xff0c;int有时又不够 。 在算乘法的时候&#xff0c;要保证乘出来的中间项也不爆long long 转载于:https://www.cnblogs.com/war1111/p/7532412.html

用Python的Tultle模块创建一个五角星

方案所需准备Python官方手册。 这里是我找到的中文版。一个可执行Python的解释器Ttultle简介来源乌龟图形是一个不错的方式来为孩子们介绍编程。它是Wally Feurzig和Seymour Papert在1966年开发的原始Logo编程语言的一部分。想象一只在x-y平面上&#xff0c;从&#xff08;0,0&…

镜像上传到linux失败,Docker push镜像失败解决方法

Docker push镜像失败解决方法发布时间&#xff1a;2017-03-09 12:07来源&#xff1a;互联网当前栏目&#xff1a;web技术类Docker push镜像失败的问题。以下是输入push自己的tomcat后出现了失败[rootslave3 ~]# docker push lekkoliu/tomcat8:latestThe push refers to a repos…

Python 之 Python2 和 Python3 的区别

1、默认编码方式 # Python2 默认编码方式是 ascll码 # Python3 默认编码方式是 utf-8 # Python2 输出中文要加 # -*- encoding:utf-8 -*- # Python3 不需要 2、print # Python2 可以使用 print&#xff0c;也可以使用 print() 例&#xff1a; print(lili) 或 print lili # Py…

【C/C++开发】C++11 并发指南二(std::thread 详解)

上一篇博客《C11 并发指南一(C11 多线程初探)》中只是提到了 std::thread 的基本用法&#xff0c;并给出了一个最简单的例子&#xff0c;本文将稍微详细地介绍 std::thread 的用法。 std::thread 在 <thread> 头文件中声明&#xff0c;因此使用 std::thread 时需要包含 &…

【找工作资料】外企面试技巧

这里谈谈面试的技巧。这是根据诚迅联丰咨询公司许国庆在北大光华管理学院、经济学院和清华经济管理学院的讲座整理出来的。他曾在美国的投资银行和商业银行工作了近十年。 一、面试前的准备 1&#xff0e;确定3W 明确面试前的三要素&#xff0d;When (时间)、Where&#xf…

触摸屏Sensor叠构实例学习记录(一)

现在从事TP这个行业&#xff0c;看再多的资料和介绍&#xff0c;不如直接拿个实例的工程图来看&#xff0c;分析每一部分具体是什么东西&#xff0c;比看再多的资料更容易入门。 以下图纸和图片都是我从网上随便下的&#xff0c;仅次于学习记录使用&#xff0c;不做另外的商业用…