Linker 什么';叮当声和叮当声的区别是什么+;什么时候建图书馆? 我用CLAN编译了一个C库(C++项目使用)。在尝试链接此库时,我遇到了链接器错误(特别是关于hqxInit函数的未定义符号)。当我切换到clang++时,它可以工作。使用nm检查时,clang++会进一步咀嚼名称。到底发生了什么?有没有更好的方法告诉链接器,一个库是munged-for-c而不是munged-for-c++?必须用C++来构建C库……看起来很愚蠢。

Linker 什么';叮当声和叮当声的区别是什么+;什么时候建图书馆? 我用CLAN编译了一个C库(C++项目使用)。在尝试链接此库时,我遇到了链接器错误(特别是关于hqxInit函数的未定义符号)。当我切换到clang++时,它可以工作。使用nm检查时,clang++会进一步咀嚼名称。到底发生了什么?有没有更好的方法告诉链接器,一个库是munged-for-c而不是munged-for-c++?必须用C++来构建C库……看起来很愚蠢。,linker,clang,clang++,Linker,Clang,Clang++,//叮当作响 $ nm libhqx.a libhqx.bak(init.c.o) 04000000 C _RGBtoYUV 00000004 C _YUV1 00000004 C _YUV2 00000000 T _hqxInit //叮当作响++ $ nm libhqx.a libhqx.a(init.o): 00000100 S _RGBtoYUV 04000100 S _YUV1 04000104 S _YUV2 00000000 T __Z7hqxInitv 大多数系统上的c

//叮当作响

$ nm libhqx.a

libhqx.bak(init.c.o)
04000000 C _RGBtoYUV
00000004 C _YUV1
00000004 C _YUV2
00000000 T _hqxInit
//叮当作响++

$ nm libhqx.a 

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

大多数系统上的
clang
clang++
都是相同的可执行文件。一个只是与另一个的象征性联系

程序将检查调用它的名称,以及:

  • 对于
    clang
    ,将代码编译为C
  • 对于
    clang++
    ,将代码编译为C++
<>在C++中,编译器为函数生成名称不同于C——这是因为可以有多个具有相同名称(但不同)参数的函数。这就是所谓的“名称混乱”——这就是你所看到的

您可以使用名为
c++filt
的工具来“demangle”名称

例如:

$ c++filt __Z7hqxInitv
hqxInit()

更多信息请点击此处:

太棒了,谢谢!“名称混乱”是一个很好的搜索词,可以更深入地挖掘它。您可以使用
--驱动程序模式
命令行参数覆盖基于名称的clang/clang++可执行语言自动检测行为。例如,
clang--driver mode=g++
应该等同于
clang++