【问题标题】:Detect compiler and use compiler-specific flags when invoking调用时检测编译器并使用特定于编译器的标志
【发布时间】:2017-02-13 01:24:58
【问题描述】:

我收到了一个变量CC,其中包含引用系统上编译器的可执行文件。我需要获取这个可执行文件并最终使用一些特定于编译器的链接参数调用它。

我目前的方法似乎很脆弱:

def guess_compiler(cc):
    out = subprocess.check_output((cc, '--version'))
    for possible in (b'clang', b'gcc'):
        if possible in out:
            return possible.decode()
    else:
        # Fall back to gcc
        return 'gcc'

由此,我使用了我关心的特定链接器参数的映射:

return {
    'clang': '-Wl,-undefined,dynamic_lookup',
    'gcc': '-Wl,--unresolved-symbols=ignore-all',
}[cc]

简而言之,我希望有一种更好(不那么脆弱)的方式来完成我已经完成的工作。

对于那些寻找我为什么想要这样的东西的人来说,这主要是为了a project I'm implementing 的可移植性。

【问题讨论】:

    标签: gcc compilation clang portability


    【解决方案1】:

    我宁愿调用带有一些伪代码的编译器并传入这些标志。这也是 Autotools 和 CMake 等工具所做的。

    您当前方法的问题是您在--version 输出中看到的文本字符串实际上可以是任意的。例如,当 clang 不那么流行时,FreeBSD 的 cc --version 一直在给予

    GCC 4.2.1 - 兼容 Clang bla bla

    所以,只需使用您感兴趣的每个标志调用编译器,然后查看退出代码。

    如何执行此操作的示例:

    for flag in FLAGS:
        try:
            subprocess.check_call((cc, 'test.c', flag), cwd=tmpdir)
            return flag
        except subprocess.CalledProcessError:
            pass
    else:
        # wellp, none of them worked, fall back to gcc and they'll get a
        # hopefully reasonable error message
        return FLAG_GCC
    

    【讨论】:

    • 编辑了我尝试使用的内容:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2010-11-17
    相关资源
    最近更新 更多