为什么这不是重复的符号错误?

时间:2019-02-05 00:44:56

标签: c xcode compiler-errors duplicate-symbol

我有一个包含.c.mm源文件的iOS框架。 为了方便起见,我们将这两个文件称为A.cB.mm

在两个文件中,我都定义了一个具有相同功能协议的功能,如下所示。

// A.c

uint32_t get_file(const char *path)
{
    ...
}

// B.mm

uint32_t get_file(const char *path)
{
    ...
}

据我所知,我认为这会在编译时抛出错误,因为存在重复的符号,但是它可以成功编译框架而没有任何错误。我在这里想念什么?

注意: 如果它是duplicate symbol.c,则将是.m链接器错误,因为Objective-C不会进行名称修改。

1 个答案:

答案 0 :(得分:5)

Objective-C ++文件(.mm)是C ++文件,因此它们经过名称处理。如果在输出上运行nm,则会看到类似以下内容的行:

$ nm a.out | grep get_file
0000000100000fa0 T __Z8get_filePKc
0000000100000f70 T _get_file

如果您在C ++版本中应用extern "C"来删除名称修饰,则会看到您所期望的冲突:

// B.mm
extern "C" uint32_t get_file(const char *path)
{
    return 0;
}


$ clang A.c B.mm
duplicate symbol _get_file in:
    /var/folders/j3/32xftcp56c12hqz7y8rl4f600000gn/T/A-d00e10.o
    /var/folders/j3/32xftcp56c12hqz7y8rl4f600000gn/T/B-d853af.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)