【问题标题】:What's the difference between clang and clang++ when building a library?建库时clang和clang++有什么区别?
【发布时间】:2012-12-01 23:59:00
【问题描述】:

我正在用 clang 编译一个 c 库(供 c++ 项目使用)。尝试链接此库时出现链接器错误(特别是有关 hqxInit 函数的未定义符号)。当我切换到 clang++ 时,它可以工作。用 nm 检查,clang++ 进一步修改了名称。发生了什么——有没有更好的方法来告诉链接器库是 munged-for-c 还是 munged-for-c++?必须用c++构建一个c库似乎很愚蠢....

//用clang构建

$ nm libhqx.a

libhqx.bak(init.c.o)
04000000 C _RGBtoYUV
00000004 C _YUV1
00000004 C _YUV2
00000000 T _hqxInit

//用clang++构建

$ nm libhqx.a 

libhqx.a(init.o):
00000100 S _RGBtoYUV
04000100 S _YUV1
04000104 S _YUV2
00000000 T __Z7hqxInitv

【问题讨论】:

    标签: linker clang clang++


    【解决方案1】:

    clangclang++ 在大多数系统上是相同的可执行文件。一个只是到另一个的符号链接。

    程序检查以查看调用它的名称,并且:

    • 对于clang,将代码编译为C
    • 对于clang++,将代码编译为C++

    在 C++ 中,编译器为函数生成的名称与 C 不同 - 这是因为您可以拥有多个具有相同名称(但不同)参数的函数。这称为“名称修改” - 这就是您所看到的。

    您可以使用一个名为 c++filt 的工具来“拆解”这些名称。

    例子:

    $ c++filt __Z7hqxInitv
    hqxInit()
    

    更多信息在这里:why clang++ behaves differently from clang since the former is a symbol link of the latter?

    【讨论】:

    • 太棒了,谢谢! “name mangling”是一个很好的搜索词,可以深入挖掘。
    • 您可以使用--driver-mode 命令行参数覆盖基于clang/clang++ 可执行名称的语言自动检测行为。例如,clang --driver-mode=g++ 应该等同于 clang++
    猜你喜欢
    • 2013-08-06
    • 2011-07-15
    • 2014-09-11
    • 1970-01-01
    • 2023-03-07
    • 2012-09-21
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多