Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过桥接头的.c文件在Xcode 8更新后不工作_Ios_C_Swift_Linker Errors_Libpd - Fatal编程技术网

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

Ios 通过桥接头的.c文件在Xcode 8更新后不工作,ios,c,swift,linker-errors,libpd,Ios,C,Swift,Linker Errors,Libpd,我一直在使用的应用程序使用一个外部库pdlib,它有自己的外部(.c文件),我一直在通过桥接头导入(.code>#导入“Uzi.c”,并通过我的ViewController类中的Uzi.c设置函数Uzi\u setup()调用我的主Swift文件。在几天前升级到新的公共Xcode8之前,我对这一点没有任何问题(整个夏天我对Xcode8Beta1没有任何问题) 以下是我得到的7个错误,列在一个“Mach-O链接器错误”保护伞下: Undefined symbols for architecture

我一直在使用的应用程序使用一个外部库pdlib,它有自己的外部(.c文件),我一直在通过桥接头导入(.code>#导入“Uzi.c”,并通过我的
ViewController
类中的Uzi.c设置函数
Uzi\u setup()
调用我的主Swift文件。在几天前升级到新的公共Xcode8之前,我对这一点没有任何问题(整个夏天我对Xcode8Beta1没有任何问题)

以下是我得到的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文件的链接:

我已经尝试了我在网上找到的所有解决类似问题的方法,但还没有找到解决方案。。。我尝试将“架构”和“有效架构”设置更改为仅armv7和armv7s(无arm64),并将“仅构建活动架构”更改为“否”。这些步骤似乎在类似的情况下对其他人有所帮助,但它们对我不起作用(拿走arm64会导致出现额外的错误)

XCode 8是一个非常新的版本(公开版本于9月13日发布),因此对于这次升级几乎没有其他问题会导致类似的问题


任何帮助都将不胜感激

由GitHub上的@danomatika解决:

“通常不应包含/导入实现文件aka.c、.cpp、.m等。这就是导致重复符号问题的原因

这就是头文件中的“转发函数声明”的作用:告诉编译器函数存在以及它获取/返回的数据。然后,编译器假设函数的实际实现存在于实现文件中。如果找不到,则会出现“未定义的符号错误”。如果最终两次声明函数,即在.c文件中同时包含一个带有转发声明的头和函数本身的implementon,则会出现“重复符号错误”

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

它们是两个简单的修复方法,都涉及到声明要从头文件中的.c文件调用的所需函数

  • 只需在桥接标头中声明函数:

    void uzi_setup()

  • 创建一个标题,比如Externals.h,并在其中声明所有Externals内容:

    //只有在.c实现中才能找到前向声明安装函数
    无效uzi_设置()

    //方便包装函数
    无效外部设置(){
    uzi_设置();
    }

    然后在桥接头中导入文件:

    #导入“Externals.h”

    在swift中,您现在可以执行以下操作:

    externals\u setup()


  • @Olaf的可能副本我看不到我的.C文件被多次链接到的任何方式。另一个引用似乎不适用于我的问题,但如果它适用,您能告诉我它可能是怎样的吗?是
    .C
    还是
    .C
    文件?第一个是C++,而不是C.@奥拉夫,它是<代码> .c/c>文件(我在问题标题中更正)。我的大部分应用程序都是用Swift编写的。我只是通过桥接头链接到这个外部。在最新的Xcode 8发行版之前,我在这方面没有任何问题。C文件是可执行文件的目标成员吗?