虚拟机编译SRS报错,绝大多数情况不是代码问题,而是依赖库缺失或环境配置不当导致的,只要按系统类型逐项安装依赖并调整虚拟机资源,就能顺利编出可运行的二进制文件。
虚拟机编译SRS报错原因:依赖库与环境的双重夹击
SRS(Simple Realtime Server)是一套开源的流媒体服务器,编译过程依赖不少第三方库,虚拟机环境和物理机不一样,系统镜像精简、默认源没配好、内存磁盘偏小,都会让编译半路翻车,遇到报错先别急着改代码,静下心来看错误输出最后几行,大部分线索都写在里面。
报错信息如何快速定位
编译时常见的报错有这几种类型:
- 头文件缺失:
fatal error: openssl/ssl.h: No such file or directory,说明没装OpenSSL开发包。 - pkg-config检测失败:
Package requirements (libavcodec) were not met,说明FFmpeg相关依赖没找到。 - 链接错误:
undefined reference to 'SSL_CTX_new',说明库文件存在但没正确链接。 - 进程被杀:
g++: internal compiler error: Killed,说明虚拟机内存不够,编译器被系统终止。 - 磁盘空间不足:
No space left on device,编译临时文件把分区塞满了。
错误里,前三类属于依赖库问题,后两类属于虚拟机资源问题,分清类别才能对症下药。
依赖库安装失败的三大坑
- 源索引过期:多数虚拟机镜像的apt或yum源长期没更新,先执行
sudo apt update或sudo yum makecache,再安装。 - 包名对不上:Ubuntu上OpenSSL开发包叫
libssl-dev,CentOS上叫openssl-devel,用错名字会出现“Unable to locate package”。 - 环境变量遗漏:某些库安装在自定义路径后,pkg-config默认找不到,需要设置
PKG_CONFIG_PATH指向.pc文件所在目录。
业内专家指出,在虚拟机上编译SRS,依赖库安装环节的出错概率比编译本身高得多,与其反复猜测,不如对照错误信息查包名。
虚拟机编译SRS和物理机对比:这五个坑你必须知道

很多人在物理机上编译SRS很顺利,换到虚拟机就各种报错,虚拟机并非不能编译,只是资源隔离机制带来了一些额外限制。
内存不足导致编译器被杀死
GCC编译大文件时比较吃内存,虚拟机内存分配太小,或者宿主机本身内存紧张,Linux内核的OOM Killer会随机挑进程下手,表现就是终端突然报Killed,然后退出。
解决思路:
- 给虚拟机分配不少于2GB内存,最好4GB以上。
- 增加2GB交换分区,用
fallocate创建swap文件后启用。 - 编译时降低并行度,例如
make -j1或make -j2,避免多任务挤爆内存。
磁盘空间不足与共享目录权限
SRS编译产生的对象文件和最终二进制文件体积不小,加上临时目录,需要预留足够空间,虚拟机默认磁盘可能只有20GB,系统更新后剩余所剩无几,编译时若使用VMware共享文件夹,还会遇到权限拒绝或文件锁问题。
建议把源码放在虚拟机本地磁盘,例如/home/你的用户名/srs,而不是/mnt/hgfs,执行df -h查看剩余空间,低于5GB就果断清理。
网络源差异影响依赖下载
虚拟机刚装好系统,官方源在部分地区下载速度很慢,甚至连接超时,依赖包没下载完整,后续configure自然失败,把apt或yum源换成国内镜像源(如清华、简米云),下载速度和成功率都会提升。
虚拟机编译SRS依赖库怎么安装?两大主流系统实操
不同Linux发行版包管理方式不一样,这里给出最常见的Ubuntu和CentOS操作路径。
Ubuntu虚拟机编译SRS依赖库安装
对应常见报错openssl/ssl.h missing,执行:
sudo apt update sudo apt install -y build-essential pkg-config libssl-dev
如果SRS配置开启了转码功能,还需要安装FFmpeg开发库:
sudo apt install -y libavcodec-dev libavformat-dev libavutil-dev
以及常见的音频编码库:
sudo apt install -y libopus-dev
安装完成后验证依赖是否就位:
pkg-config --modversion openssl
能看到版本号就说明环境正常,接着回到SRS源码目录,重新执行./configure和make,多系统场景下,Ubuntu上的依赖库安装最为省心。
CentOS虚拟机编译SRS依赖库安装
CentOS上包名不同,如果提示openssl/ssl.h not found,执行:
sudo yum groupinstall "Development Tools" sudo yum install -y openssl-devel pkgconfig
需要FFmpeg支持时,先安装EPEL和RPM Fusion源,再安装ffmpeg-devel,CentOS 7自带的gcc版本较老,如果编译报internal compiler error,考虑使用devtoolset高版本编译器:
sudo yum install -y centos-release-scl sudo yum install -y devtoolset-7 scl enable devtoolset-7 bash
之后重新编译,问题通常迎刃而解。
从源码编译依赖库的特殊场景
当系统包管理器提供的库版本太旧,无法满足SRS要求时,只能手动编译安装,以OpenSSL为例:
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix=/usr/local/openssl make -j4 sudo make install
安装后告知pkg-config库位置:
export PKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig:$PKG_CONFIG_PATH
然后重新运行SRS的./configure,加上--with-ssl参数指向该路径。
虚拟机编译SRS报错?从链接错误到内存不足的完整排查清单
在虚拟机里折腾编译,最难受的是错误信息又多又分散,建议按下述顺序排查,大部分情况能在十分钟内定位。
undefined reference错误背后的库顺序问题
链接时出现undefined reference,先确认库是否安装,再确认链接顺序是否正确,GNU链接器在命令行中从前往后扫描库文件,有依赖关系的库必须放在被依赖库的后面。
例如SRS的Makefile中如果出现-lssl和-lcrypto,一般-lcrypto放在后面,手动编译测试程序时,可以这样写:
gcc test.c -o test -lssl -lcrypto

把-lssl改成-lcrypto -lssl有时能解决问题,在SRS中通常不需要手动改,只需运行make clean后重新执行./configure,让系统重新生成正确的链接参数。
libssl版本冲突怎么办
虚拟机系统可能自带多个OpenSSL版本,比如CentOS既有系统自带的1.0.2,又有手工编译的1.1.1,SRS配置时检测到错误的版本就会报错,建议先卸载自装版本,或者明确指定路径:
./configure --with-ssl=/usr/local/openssl
内存不足的应急手段
临时扩大内存最直接的方法是加swap:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
这个方法在简米云虚拟机编译SRS时也常用,避免因内存不足重新排队编译,简米云轻盈型主机内存往往只有1GB,加上swap后勉强能完成小型项目编译。
覆盖了从依赖库缺失、包名错误,到内存不足、库冲突的常见关卡,碰到编译错误时,先看报错属于“找不到”还是“被杀掉”,前者查依赖,后者查资源,SRS本身代码质量稳定,只要环境理顺,在虚拟机里编译其实比想象中省力。
虚拟机编译SRS报错常见问题解答
虚拟机编译SRS报错“fatal error: openssl/ssl.h: No such file or directory”怎么处理?
Ubuntu执行sudo apt install -y libssl-dev,CentOS执行sudo yum install -y openssl-devel,安装完成后运行./clean && ./configure重新配置,再执行make。
虚拟机编译SRS时遇到“cannot find -lssl”如何处理?
说明库文件存在但路径没有加到链接器搜索目录,先确认libssl.so在/usr/lib/x86_64-linux-gnu/或/usr/lib64/下,然后执行sudo ldconfig刷新缓存,若仍然找不到,手动设置LIBRARY_PATH和LD_LIBRARY_PATH指向库所在目录。
虚拟机编译SRS过程中“internal compiler error”如何解决?
这是内存不足的典型信号,先执行free -h确认可用内存,增加swap分区再试,若swap后依旧报错,使用make -j1关闭并行编译,减轻内存压力。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/911846.html


评论列表(3条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于虚拟机编译的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是虚拟机编译部分,给了我很多新的思路。感谢分享这么好的内容!
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是虚拟机编译部分,给了我很多新的思路。感谢分享这么好的内容!