在构建库时,clang和clang ++有什么区别?

时间:2012-12-14 00:32:30

标签: linker clang clang++

我正在用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

1 个答案:

答案 0 :(得分:9)

大多数系统上的

clangclang++都是相同的可执行文件。一个只是另一个的象征性链接。

程序检查它下面调用的名称,并且:

  • 代表clang,将代码编译为C
  • for 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?