Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Macos &引用;不能';“在库中找不到函数符号”JS Ctypes 我的C++库函数是:代码> int rddSistBaseButtuthTHead()/ 我在overlay.js中的代码是 uri = addon.getResourceURI("components/mac/libReverbFirefoxExtensionLib.dylib"); this.extensionLib = ctypes.open(uri.path); this.startBackgroundThread = this.extensionLib.declare("RFD_startBackgroundThread", ctypes.default_abi, ctypes.unsigned_int);_Macos_Firefox_Firefox Addon_Osx Lion_Jsctypes - Fatal编程技术网

Macos &引用;不能';“在库中找不到函数符号”JS Ctypes 我的C++库函数是:代码> int rddSistBaseButtuthTHead()/ 我在overlay.js中的代码是 uri = addon.getResourceURI("components/mac/libReverbFirefoxExtensionLib.dylib"); this.extensionLib = ctypes.open(uri.path); this.startBackgroundThread = this.extensionLib.declare("RFD_startBackgroundThread", ctypes.default_abi, ctypes.unsigned_int);

Macos &引用;不能';“在库中找不到函数符号”JS Ctypes 我的C++库函数是:代码> int rddSistBaseButtuthTHead()/ 我在overlay.js中的代码是 uri = addon.getResourceURI("components/mac/libReverbFirefoxExtensionLib.dylib"); this.extensionLib = ctypes.open(uri.path); this.startBackgroundThread = this.extensionLib.declare("RFD_startBackgroundThread", ctypes.default_abi, ctypes.unsigned_int);,macos,firefox,firefox-addon,osx-lion,jsctypes,Macos,Firefox,Firefox Addon,Osx Lion,Jsctypes,代码在最后一行抛出异常。它说“在库中找不到函数符号” 该库是OSXLion(10.7)上结合i386和x86_64(但不是PPC arch)的“胖动态库二进制文件”。Firefox版本11 急需帮助。 谢谢 Rahul.问题是,库没有按原样存储符号。要查看符号的实际名称,请使用nm library name(可选地将其重定向到txt文件,以便于阅读)转储库 我的案例中的符号写为\uuuuuuz25rfd\uStartBackgroundThreadv。显然,我必须去掉一个下划线,只使用\u Z2

代码在最后一行抛出异常。它说“
在库中找不到函数符号

该库是OSXLion(10.7)上结合i386和x86_64(但不是PPC arch)的“胖动态库二进制文件”。Firefox版本11

急需帮助。 谢谢
Rahul.

问题是,库没有按原样存储符号。要查看符号的实际名称,请使用
nm library name
(可选地将其重定向到txt文件,以便于阅读)转储库

我的案例中的符号写为
\uuuuuuz25rfd\uStartBackgroundThreadv
。显然,我必须去掉一个下划线,只使用
\u Z25RFD\u startBackgroundThreadv


感谢迈克尔·道特曼

在大多数Unix平台(包括OS X)中,C函数只需在前缀中加下划线就可以映射到符号,因此
int foo(int)
最终只会变成
\u foo

但是,在C++中,C++中可以有两个不同的函数,名称相同,可以用各种不同的方式,可以有<代码> int fo(int)< /c>和<代码>双fo(double)< /> >,或者<代码> int MyClass::Foint(int)< />代码>或<代码> int fo(int)< /C> >,等等。所以,C++函数必须“”给出一个唯一的字符串。(然后,该唯一字符串被视为一个C函数,前缀为“389;”。)

jsctypes知道如何去掉,但它不知道如何破坏函数,因为您只是给它一个名称,而不是一个完整的原型。因此,您必须以其他方式确定被破坏的函数名是
\u Z25RFD\u startBackgroundThreadv

对于名称如何被破坏,没有可移植的标准。但是,苹果使用的C++ ABI是基于API的,这需要API来对C++函数进行加密和解散。Xcode附带了一个名为c++filt的工具,它封装了该API以供在命令行中使用,但它只处理Demanling,而不处理mangling。因此,它可以告诉您
\u Z25RFD\u startBackgroundThreadv
的意思是
RFD\u startBackgroundThread()
,但它不能反过来

获取损坏名称的一种方法是从
nm libfoo.dylib
开始,然后使用c++过滤器检查那些看起来很好的候选名称,直到找到一个与您正在寻找的原型匹配的名称

另一种方法是实现自动化。大概是这样的:

nm libfoo.dylib | awk 'NF==2 {printf "%s ",$1; system("c++filt " $2)} NF!=2{print $0}'
…将打印所有符号的所需名称

但最好的方法可能是创建一个极小的.cpp文件,该文件中除了一个原型之外什么都没有,然后编译它,然后使用“otool-SV tiny.a”来查看损坏的名称

所以,要调用C++函数的符号的名称并不难。


但这并不意味着你可以像调用C函数一样调用它。举一个非常明显的例子,如果您想调用(非静态)Foo::bar(int),最好将一个有效的东西作为“this”指针传递,并知道如何传递它。有关Mozilla中的jsctypes不能做什么以及为什么不能做的详细信息,请参阅。

如果对库执行“
nm
”转储,那么“
RFD\u startBackgroundThread
”符号是如何显示的?它是“
RFD\u startBackgroundThread
”还是其他东西,如“
\uuu\RFD\u startBackgroundThread
”或更模糊的东西?检查转储。有一行写着“
00000000000010a0 T\uuuuuz25rfd\uStartBackgroundThreadv
”。这就是我应该使用的函数名吗?我尝试了
this.startBackgroundThread=this.extensionLib.declare(“\uuuuz25rfd\u startBackgroundThreadv”,ctypes.default\u abi,ctypes.unsigned\u int”)取而代之。没用。同样的例外。试着去掉一个下划线。成功了!谢谢为什么没有这方面的文件?