5

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

// 用 clang++ 构建

$ nm libhqx.a 

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

1 回答 1

12

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

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

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

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

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

例子:

$ c++filt __Z7hqxInitv
hqxInit()

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

于 2012-12-14T18:44:47.307 回答