GNU 链接器着色

GNU 链接器着色

使用 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.

相关内容