链接C代码时出现重复的符号错误

时间:2017-04-13 18:41:10

标签: c swift xcode swift3

我正在尝试使用一些用C编写的函数。但是我收到以下错误消息:

duplicate symbol _getInt in:
    /Users/<redacted>/Library/Developer/Xcode/DerivedData/Test-ecbrpcljzanjildnvawnrcgejdwn/Build/Intermediates/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/x86_64/source.o
    /Users/<redacted>/Library/Developer/Xcode/DerivedData/Test-ecbrpcljzanjildnvawnrcgejdwn/Build/Intermediates/Test.build/Debug-iphonesimulator/Test.build/Objects-normal/x86_64/swift.o
    ld: 1 duplicate symbol for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

swift.swift:

print(getInt())

header.h:

#ifndef header_h_
#define header_h_
#include "source.c"
#endif

由source.c:

int getInt() {
    return 4;
}

这些是我的桥接标头设置 enter image description here

1 个答案:

答案 0 :(得分:1)

您的标头不得包含.c文件。

.c个文件应包含.h个文件。

每个.c文件都是自己的&#34;编译单元&#34;。编译器分别编译所有编译单元。您可以在source.h中包含source.c,以便标题用于在编译单元中提供函数实现的前向声明。

如果在source.c中包含source.h,那么包含source.h(包括source.c)的每个编译单元都将获得自己在{{1}中定义的实现的副本}}。这意味着会有相同内容的多个定义,编译器也不知道选择哪一个。这就是为什么你得到这个&#34;重复&#34;符号错误。我怀疑source.cswift.c都包含source.c