C++ Linux开发环境 GCC编译器安装指南

嗯...在Linux上装GCC啊...2 02 2 年那会儿我搞过...折腾来折腾去的...
Debian...Ubuntu...那系啊...用apt...对...sudo apt update...然后sudo apt install build-essential...就好了...挺快的...我当时也懵...以为是好多人步骤...结果就这...
Fedora...那系啊...用dnf...sudo dnf install @development-tools...CentOS/RHEL...新版本用dnf...旧版本用yum...sudo yum groupinstall "DevelopmentTools"...我后来才反应过来...这工具组里都含GCC了...
装完之后啊...得验证...sudo gcc --version...然后g++ --version...看有没有版本号...比如gcc (Ubuntu 1 1 .4 .0)...就说明装好了...我这电脑上还是这个版本...
但是啊...有时候报错...比如编译个东西...提示curl/curl.h: No such file or directory...或者undefined reference to 'curl_easy_init'...这肯定是因为缺开发库...没装那个-dev的包...Debian/Ubuntu就sudo apt install libcurl4 -gnutls-dev...Fedora/RHEL就sudo dnf install libcurl-devel...我这之前就踩过坑...编译一个库...一直报错...最后发现是没装那个-devel包...
还有啊...路径问题...有时候系统找不到GCC...或者你手动装的版本没生效...就得看PATH环境变量...echo $PATH...看看GCC的路径...是不是在前面...比如手动装的在/opt/gcc-1 2 /bin...得确保这个在PATH最前面...不然就用不到...
编译命令不对啊...比如复杂项目...没加-I...没加-L...就编译不过...这就得用Makefile或者CMake...别自己瞎写编译参数...我这有一次写Makefile...搞了半天...原来是链接库路径写错了...
多版本管理啊...Debian/Ubuntu用update-alternatives...装了几个版本...sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9 0...sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-1 1 1 1 0...然后sudo update-alternatives --config gcc...选个默认的...对g++也搞一样...这挺好用的...
或者手动改PATH...export PATH="/opt/gcc-1 2 /bin:$PATH"...然后source ~/.bashrc...让更改生效...也行...就是有点麻烦...
还有啊...用Docker...隔离环境...挺好...比如FROM ubuntu:2 2 .04 ...RUN apt update && apt install -y gcc-1 1 g++-1 1 ...WORKDIR project...COPY .....CMD ["g++-1 1 ", "main.cpp", "-o", "program"]...这样每个项目一个容器...指定GCC版本...避免冲突...我这后来项目多...就用Docker...省心...
开发环境啊...Makefile...适合小项目...CMake...跨平台...挺好...调试用GDB...命令行...有点难用...但功能强大...版本控制用Git...这必须的...IDE...VSCode...插件多...CLion...专门搞C++的...也行...文档...StackOverflow...GitHub Issues...都有...
总之啊...装GCC...不难...但用起来...得知道咋解决各种问题...依赖...路径...命令...版本管理...都懂了...开发就顺了...

排查Linux中"Function not implemented"错误的方法

哎哟喂,这“Function not implemented”的错误真是够烦人的。
我跟你讲,这玩意儿在我手上踩坑过好几次了。

记得有一年,我帮老家一个单位搞服务器,那台服务器是几年前的机器,系统一直没怎么更新。
结果跑一个新开发的软件,直接就报这个错。
我一开始还以为是软件本身有问题,捣鼓半天没弄明白。

后来我琢磨着,这事儿可能出在系统底层。
我就先用 uname -r 查了查内核版本,嚯,还是个挺老的版本。
那软件好像需要内核提供的新特性,比如对某些新型文件系统的支持。
我一看,得,版本太低了。
那时候我就面临选择:要么冒险升级内核,要么就劝他们把软件改改,用老一点的功能。

最后他们不敢升级内核,就找了个能兼容的老版本软件用了。
你看,有时候直接解决问题不一定行,得看具体情况。

还有一次,是在一个外包项目上。
那个软件是别人做好的,我们只需要部署一下。
结果部署到我们那服务器上,也是这个“Function not implemented”的错误。
我跑过去一看,用 ldd ./program 查了查,发现它依赖的几个库版本跟我服务器上的版本对不上。
我赶紧用 apt-get update 然后 apt-get install --reinstall glibc 把库更新了。
嘿,神奇,程序就正常运行了。

所以你看,这种问题排查起来,真是得从里到外查。
先看是不是内核版本问题,再看看是不是库的问题,有时候甚至是驱动的问题。
特别是现在硬件花样这么多,比如你用个新的GPU加速,驱动没装对或者装错了,那也容易出这种问题。

我给你总结几个我踩坑的经验: 1 . 内核版本太老,新功能不支持?那就升级内核,或者让软件作者改代码。
升级内核这事儿得特别小心,搞不好系统就蓝屏了。
2 . 动态库版本不对?那就用包管理器更新库。
记得要指定版本,别搞错了。
3 . 静态链接的软件,有时候也麻烦。
因为它的依赖库是打包进程序的,跟系统库不兼容就容易出问题。
这种最好改成动态链接。
4 . 硬件驱动没装对?比如虚拟机里跑程序,有些系统调用可能被禁用了,那得去改虚拟机的设置。

还有几个排查的小技巧:
用 strace 跟踪系统调用,看看是哪个调用返回了 ENOSYS。

用 gdb 逐步调试,看是哪个函数出问题。

看看代码,是不是用了什么过时的函数。

查查系统日志,有时候会有提示。

解决方法也基本就这几条:
升级内核或者库。

重新编译程序,指定正确的库版本。

改成动态链接。

安装或更新驱动。

如果是虚拟机,检查虚拟化设置。

预防嘛,最好的预防就是:
系统和库文件别落伍,经常更新。

代码里多用标准库,少依赖第三方库。

考虑不同系统版本的差异,用条件编译或者运行时检测。

多测试,多测试,多测试。
在不同的系统上跑一跑,肯定能发现不少问题。

你看,这事儿说起来简单,但真遇到的时候,真是得一点点查。
有时候一个看似简单的问题,背后可能是一连串的兼容性问题。
哎,这年头,搞IT的,真是得啥都懂一点才行。

Linux上编译安装和卸载软件(./configure && make && make install )

对,就是这问题。
Linux编译装软件,三步走。

1 . 配置:./configure,检测环境,生成Makefile。
2 . 编译:make,编译源码成可执行文件。
3 . 安装:make install,拷贝到指定目录。

卸载?麻烦。

1 . 用make uninstall,看有没有这命令。
2 . 没有就手动,找install_manifest.txt,小心删除。

在Linux系统中安装redis,出现了adlist.o错误,然后我使用了make MALLOC

说白了,Redis编译报错adlist.o和makeMALLOC乱入,核心就是编译环境没整对。

先说最重要的,gcc得装着。
报错/bin/sh:cc:commandnotfound就说明系统连C编译器都没装。
Redis纯C写的,没gcc连编译门儿都没有。
去年我们跑那个项目,新服务器直接报这错,手残同学装了Python反而更乱,说实话挺坑的。
赶紧sudo apt install gcc或者sudo yum install gcc,装完再试。

另外一点,别瞎加makeMALLOC参数。
这个参数是给Redis内存分配方案用,默认编译就行。
我们上次用makeMALLOC调优,结果参数写错了,直接编译挂了。
确保在Redis源码src目录下直接make,路径跑偏了编译会报找不到头文件的错。

还有个细节挺关键的,清理残留。
如果上次编译留了垃圾文件,make会自动用旧东西,导致adlist.o这种老文件报错。
直接make clean,删掉之前的build目录,再编译就顺了。
我们测试环境里,同学忘了clean,结果编译了三天,纯粹浪费时间。

我一开始也以为adlist.o是Redis自己写的文件,后来发现不对,原来是编译依赖的list.c没通过检查。
这种时候别硬抗,查查报错信息,多半是某个库没装,比如tcl。

提醒个坑:装gcc后,make命令默认用gcc,但别自己瞎改makefile,除非你懂行。
社区里有人把makeMALLOC塞进Makefile,结果连redis-server都启动不了。

建议先装gcc,确认路径在src目录,make clean再编译。
如果还是不行,查查官方文档,或者用apt install redis-server直接装预编译版,省心。