我正在用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
最佳答案
clang
和 clang++
在大多数系统上都是相同的可执行文件。一个只是到另一个的符号链接(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/