linker - 建库时clang和clang++有什么区别?

标签 linker clang clang++

我正在用clang编译一个c库(供c++项目使用)。尝试链接此库时出现链接器错误(特别是关于 hqxInit 函数的 undefined symbol )。当我切换到 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

最佳答案

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

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

  • 对于 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?

    关于linker - 建库时clang和clang++有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870967/

    相关文章:

    c++11 - 使用与 typedef - 是否存在微妙的、鲜为人知的区别?

    c - 在运行时重定位函数 - gcc

    c++ - 什么时候应该明确地赋予 noexcept 属性?

    c - 仅针对特定类型的#pragma 声明 Clang 的 -fno-caret-diagnostics

    imagemagick - 使用 autotools 将 "-stdlib=libc++"传递给 C++ 链接器

    c++ - 有没有办法在 clang 中检测 C++ 代码中的编译器 -fxxxx 标志?

    c++ - 关于包含一个新类的基本 cmake 问题

    c++ - 静态 libstdc++.a 中的全局符号在共享 libstdc++.so 中是局部的

    c++ - 为什么我突然从游戏项目中获得引用我的游戏引擎的未解析外部符号

    c++ - g++ 无法覆盖退出函数