.c文件通过桥接头不工作后Xcode 8更新

问题描述:

我一直在处理的应用程序使用外部库,pdlib,它有自己的外部(.c文件),我已经通过桥接头导入#import "Uzi.c"并在我的ViewController类中通过Uzi.c的设置函数Uzi_setup()调用我的主Swift文件。直到前几天更新到新的公共Xcode 8(我在夏季Xcode 8 Beta 1没有问题)之前,我一直没有问题。.c文件通过桥接头不工作后Xcode 8更新

这里是7个错误我得到的,下单“的Mach-O链接错误”伞列出:

Undefined symbols for architecture x86_64: 
"_Uzi_bang", referenced from: 
    _Uzi_setup in ViewController.o 
"_Uzi_class", referenced from: 
    _Uzi_setup in ViewController.o 
"_Uzi_float", referenced from: 
    _Uzi_setup in ViewController.o 
"_Uzi_new", referenced from: 
    _Uzi_setup in ViewController.o 
"_Uzi_pause", referenced from: 
    _Uzi_setup in ViewController.o 
"_Uzi_resume", referenced from: 
    _Uzi_setup in ViewController.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

这些未定义的符号6层的功能和类从Uzi.c.声明这里有一个链接到整个C文件:https://github.com/electrickery/pd-miXedSon/blob/master/hammer/Uzi.c

我已经尝试了每种解决方案,我已经在网上找到处理类似问题,没有解决方案呢......我试着改变“架构”和“有效的架构”设置为只有armv7和armv7s(没有arm64)并将“仅生成活动架构”更改为“否”。这些步骤似乎可以帮助其他人在类似的情况下,但他们不适合我(并带走arm64导致出现更多的错误)。 XCode 8是最新版本(公开版本于9月13日发布),所以实际上没有其他问题会引起类似的问题。

任何帮助将不胜感激!

+0

[未定义参考C++](http://stackoverflow.com/questions/6284720/undefined-reference-c) – Olaf

+0

@Olaf的可能重复我看不出有什么办法,我的.C文件被不止一次链接。那另一个参考似乎不适用于我的问题,但如果它确实如此,你能告诉我它可能吗? – PlateReverb

+0

那是'.C'还是'.c'文件?第一个是C++,而不是C. – Olaf

解决了@danomatika在GitHub上:https://github.com/libpd/libpd/issues/149

“你一般不应包括/导入实现文件又名.C,的.cpp,.M,等等,这是什么原因造成的重复的符号问题。

这就是头文件中的“forward function declaration”用于:告诉编译器一个函数存在以及它返回的数据然后编译器假定函数的实际实现存在于一个实现中如果找不到,那么你会得到一个“未定义的符号错误”。如果你以某种方式最终声明了这个函数两次,也就是包含一个包含前向声明和imp lextaton的.c文件中的函数本身,那么你会得到一个“重复的符号错误”。

这是所有较低级别的东西,这只是真正的问题,因为Pd外部是围绕动态库设计的,所以没有构建或提供包含函数声明的头文件。这就是为什么你必须做一些额外的工作,并自己动手。

他们是这两个简单的修复,这两个都涉及声明您要从头文件中的.c文件调用所需的函数。

  1. 只要声明该函数在桥接报:

    void uzi_setup();

  2. 创建标题,说的外部材料。H,并声明所有的外部的东西有:

    // forward declare setup functions only found in .c implementations void uzi_setup();

    // convenience wrapper function void externals_setup() { uzi_setup(); }

    然后导入该文件在你的桥接报:

    #import "Externals.h"

    而且在迅速,您现在可以做:

    externals_setup()