gpt4 book ai didi

linker - 建库时clang和clang++有什么区别?

转载 作者:行者123 更新时间:2023-12-04 22:48:36 27 4
gpt4 key购买 nike

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

最佳答案

clangclang++在大多数系统上都是相同的可执行文件。一个只是到另一个的符号链接(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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com