我一直在开发的应用程序使用外部库 pdlib,它有自己的外部文件(.c 文件),我一直通过桥接 header #import "Uzi.c" 并在我的 ViewController 类中通过 Uzi.c 的设置函数 Uzi_setup() 调用我的主 Swift 文件。在几天前更新到新的公共(public) Xcode 8 之前,我对此没有任何问题(我在夏季使用 Xcode 8 Beta 1 没有问题)。
这是我得到的 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)
那些 undefined symbol 是 6 个函数和一个从 Uzi.c 声明的类。这是整个 c 文件的链接:https://github.com/electrickery/pd-miXedSon/blob/master/hammer/Uzi.c
我已经尝试了我在网上找到的所有解决类似问题的解决方案,但还没有解决方案......我尝试将“架构”和“有效架构”设置更改为仅 armv7 和 armv7s(无 arm64)和将“仅构建事件架构”更改为“否”。这些步骤似乎可以帮助处于类似情况的其他人,但它们对我不起作用(并且取消 arm64 会导致出现其他错误)。
XCode 8 是最新的(公共(public)版本于 9 月 13 日发布),因此几乎没有关于此升级导致类似问题的其他问题。
如有任何帮助,我们将不胜感激!
最佳答案
由@danomatika 在 GitHub 上解决:https://github.com/libpd/libpd/issues/149
“您通常不应包含/导入实现文件,也就是 .c、.cpp、.m 等。这就是导致重复符号问题的原因。
这就是头文件中的“前向函数声明”的作用:告诉编译器函数存在以及它获取/返回什么数据。编译器然后假定函数的实际实现存在于实现文件中。如果找不到,则会出现“ undefined symbol 错误”。如果您以某种方式最终声明了该函数两次,也就是在 .c 文件中包含带有前向声明的 header 和函数本身的实现,那么您会收到“重复符号错误”。
这都是低级的东西,只是真正的问题,因为 Pd 外部是围绕动态库设计的,因此没有构建或提供包含函数声明的 header 。这就是为什么您必须自己做一些额外的工作。
有两个简单的修复方法,都涉及在头文件中声明您要从 .c 文件调用的所需函数。
只需在桥接 header 中声明函数:
void uzi_setup();
创建一个头文件,例如 Externals.h,并在那里声明所有外部内容:
//前向声明仅在 .c 实现中找到的设置函数
void uzi_setup();
//便利包装函数
void externals_setup() {
uzi_setup();
}
然后将文件导入桥接 header 中:
#import "Externals.h"
现在,您可以快速执行以下操作:
externals_setup()
关于ios - Xcode 8 更新后,通过桥接 header 的 .c 文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39736040/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara
这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user