Ubuntu 16.04下clang软链接无法编译C++文件问题排查
问题原因分析
你的软链接创建确实存在一个关键问题——clang和clang++本质是同一个二进制程序,它通过调用时的程序名来切换编译模式。
具体来说:
- 当程序被叫做
clang(或类似带clang的名字但不含++)时,默认以C语言编译模式运行; - 当程序被叫做
clang++(或类似clang++-x.x的名字)时,才会自动启用C编译模式,包括链接C标准库、识别C++语法等。
你创建的软链接cclang指向了clang++-5.0,但程序运行时会检测自己的调用名称是cclang,而非clang++相关的名字,所以它会切换回默认的C编译模式,这就导致你编译C文件时出现和用clang编译C一样的错误。
解决方案
这里有两种可行的解决办法:
方案一:修改软链接名称为clang++
如果你不需要自定义名字,直接把软链接改成标准的clang++即可:
# 先删除之前的cclang软链接(如果它在/usr/bin下) sudo rm /usr/bin/cclang # 创建指向clang++-5.0的标准软链接 sudo ln -s /usr/bin/clang++-5.0 /usr/bin/clang++
之后直接用clang++ helloworld.cpp就能正常编译C++文件了。
方案二:用Shell脚本替代软链接(保留cclang名字)
如果你一定要用cclang作为调用名称,可以创建一个简单的Shell脚本代替软链接:
- 创建脚本文件:
sudo nano /usr/bin/cclang
- 在脚本中写入以下内容:
#!/bin/bash /usr/bin/clang++-5.0 "$@"
- 给脚本添加执行权限:
sudo chmod +x /usr/bin/cclang
这样当你运行cclang helloworld.cpp时,脚本会直接调用clang++-5.0并传递所有参数,程序会以C++模式正常编译。
验证建议
你可以先检查当前软链接的状态,确认它的指向和位置:
ls -l /usr/bin/clang /usr/bin/cclang
如果软链接不在/usr/bin目录下,可能需要将它移到该目录,或者把软链接所在目录添加到系统PATH环境变量中,否则系统可能无法找到这个命令。
内容的提问来源于stack exchange,提问作者Bin
相关产品推荐
相关产品推荐

