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

Kao*_*ire 4 linker clang clang++

我正在使用clang编译ac库(由c ++项目使用).在尝试链接此库时,我收到了链接器错误(特别是关于hqxInit函数的未定义符号).当我切换到clang ++时,它可以工作.用nm检查,clang ++进一步说明这些名字.发生了什么 - 有没有更好的方法告诉链接器一个库是munged-for-c而不是munged-for-c ++?用c ++构建ac库似乎很愚蠢....

//用clang构建

$ nm libhqx.a

libhqx.bak(init.c.o)
04000000 C _RGBtoYUV
00000004 C _YUV1
00000004 C _YUV2
00000000 T _hqxInit
Run Code Online (Sandbox Code Playgroud)

//用clang ++构建

$ nm libhqx.a 

libhqx.a(init.o):
00000100 S _RGBtoYUV
04000100 S _YUV1
04000104 S _YUV2
00000000 T __Z7hqxInitv
Run Code Online (Sandbox Code Playgroud)

Mar*_*low 10

clangclang++大多数系统都是一样的可执行文件.一个只是另一个的象征性链接.

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

  • for clang,编译代码为C.
  • for clang++,将代码编译为C++

在C++中,编译器为函数生成的名称与C不同 - 这是因为您可以使用具有相同名称(但不同)参数的多个函数.这被称为"名称重整" - 这就是你所看到的.

您可以使用一个名为c++filt"demangle"名称的工具.

例:

$ c++filt __Z7hqxInitv
hqxInit()
Run Code Online (Sandbox Code Playgroud)

更多信息:为什么clang ++与clang的行为不同,因为前者是后者的符号链接?

  • 您可以使用 `--driver-mode` 命令行参数覆盖 clang/clang++ 基于可执行文件名称的语言自动检测行为。例如,`clang --driver-mode=g++` 应该等同于 `clang++`。 (2认同)