使用 GCC 或 Clang 编译代码可能会导致一些彩色错误输出。
然而,链接代码却无法享受同样的奢侈。 GNU 链接器似乎不支持开箱即用的彩色错误输出。
有没有解决的办法?是否可以对 ld 中的链接器错误进行着色/风格化?
答案1
您可以使用一个简单的包装脚本来为 ld 输出着色。
我保存了以下脚本,/usr/local/bin/ld
假设真实的ld
位于/usr/bin/ld
。
现在我可以更改我的PATH
指向该目录:
export PATH="/usr/local/bin:${PATH}"
另存为/usr/local/bin/ld
并执行chmod +x /usr/local/bin/ld
#!/usr/bin/env python3
import subprocess
import sys
import re
RED = '\033[91m'
GREEN = '\033[92m'
ENDC = '\033[0m'
def colorize_output(line):
pattern = r'([\/\w\.-]+):(\d+)'
colored_line = re.sub(pattern, RED + r'\1' + ENDC + ':' + GREEN + r'\2' + ENDC, line)
return colored_line
def run_ld(args):
process = subprocess.Popen(['/usr/bin/ld'] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
output = process.stdout.readline()
if not output and process.poll() is not None:
break
if output:
print(colorize_output(output.decode()), end='')
while True:
output = process.stderr.readline()
if not output and process.poll() is not None:
break
if output:
print(colorize_output(output.decode()), end='')
return process.poll()
if __name__ == '__main__':
# Pass all arguments to the ld command
exit_code = run_ld(sys.argv[1:])
sys.exit(exit_code)
唯一的问题是该脚本将首先打印stderr
然后stdout
.
更复杂的脚本可以扫描路径以找到正确的ld
.