为什么这不是重复符号错误?
Why is this not a duplicate symbol error?
我有一个 iOS 框架,其中包含 .c
、.mm
个源文件。
为了方便起见,我们将这两个文件称为 A.c
和 B.mm
.
在这两个文件中,我定义了一个具有相同函数协议的函数,如下所示。
// A.c
uint32_t get_file(const char *path)
{
...
}
// B.mm
uint32_t get_file(const char *path)
{
...
}
据我所知,我认为这会在编译时抛出一个错误,因为有重复的符号,但它成功地编译了框架,没有任何错误。我在这里错过了什么?
注意:
如果它是 .c
和 .m
,这将是一个 duplicate symbol
链接器错误,因为 Objective-C 没有进行名称修改。
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)
我有一个 iOS 框架,其中包含 .c
、.mm
个源文件。
为了方便起见,我们将这两个文件称为 A.c
和 B.mm
.
在这两个文件中,我定义了一个具有相同函数协议的函数,如下所示。
// A.c
uint32_t get_file(const char *path)
{
...
}
// B.mm
uint32_t get_file(const char *path)
{
...
}
据我所知,我认为这会在编译时抛出一个错误,因为有重复的符号,但它成功地编译了框架,没有任何错误。我在这里错过了什么?
注意:
如果它是 .c
和 .m
,这将是一个 duplicate symbol
链接器错误,因为 Objective-C 没有进行名称修改。
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)