Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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
如何防止“全球覆盖”的;新";从外部库链接到的运算符 在我们的iPhone XCOD3.2.1项目中,我们链接到2个外部静态C++库,LBBLUL.A和LIGRUN。libBlue.a全局覆盖“new”操作符以进行自己的内存管理。然而,当我们构建项目时,libGreen.a最终使用libBlue的新操作符,这导致了崩溃(可能是因为libBlue.a正在对分配的结构类型进行假设)。libBlue.a和libGreen.a都是由第三方提供的,所以我们不能更改他们的任何源代码或构建选项_C++_Iphone_Xcode_Linker_New Operator - Fatal编程技术网

如何防止“全球覆盖”的;新";从外部库链接到的运算符 在我们的iPhone XCOD3.2.1项目中,我们链接到2个外部静态C++库,LBBLUL.A和LIGRUN。libBlue.a全局覆盖“new”操作符以进行自己的内存管理。然而,当我们构建项目时,libGreen.a最终使用libBlue的新操作符,这导致了崩溃(可能是因为libBlue.a正在对分配的结构类型进行假设)。libBlue.a和libGreen.a都是由第三方提供的,所以我们不能更改他们的任何源代码或构建选项

如何防止“全球覆盖”的;新";从外部库链接到的运算符 在我们的iPhone XCOD3.2.1项目中,我们链接到2个外部静态C++库,LBBLUL.A和LIGRUN。libBlue.a全局覆盖“new”操作符以进行自己的内存管理。然而,当我们构建项目时,libGreen.a最终使用libBlue的新操作符,这导致了崩溃(可能是因为libBlue.a正在对分配的结构类型进行假设)。libBlue.a和libGreen.a都是由第三方提供的,所以我们不能更改他们的任何源代码或构建选项,c++,iphone,xcode,linker,new-operator,C++,Iphone,Xcode,Linker,New Operator,当我们从项目中删除libBlue.a时,libGreen.a没有任何问题。然而,对库的链接顺序进行任何洗牌似乎都不能解决问题,对各种链接标志的任何实验也不能解决问题。有没有办法告诉XCODE告诉链接器“让LBGRIN使用新的操作符,使用标准的C++新操作符而不是由LBBLUE重新定义的”?< / P> < P>我不确定这是否可行,但是你可以尝试在代码中重写新的本地。在实现中,可以复制/粘贴标准新操作符的实现。当需要在代码中创建新对象时,请调用new而不是libBlue已覆盖的全局new。然后找到

当我们从项目中删除libBlue.a时,libGreen.a没有任何问题。然而,对库的链接顺序进行任何洗牌似乎都不能解决问题,对各种链接标志的任何实验也不能解决问题。有没有办法告诉XCODE告诉链接器“让LBGRIN使用新的操作符,使用标准的C++新操作符而不是由LBBLUE重新定义的”?< / P> < P>我不确定这是否可行,但是你可以尝试在代码中重写新的本地。在实现中,可以复制/粘贴标准新操作符的实现。当需要在代码中创建新对象时,请调用new而不是libBlue已覆盖的全局new。然后找到libBlue的作者,告诉他你的想法

请查看比我希望提供的更好的摘要


编辑:你是说libGreen.a中的代码将从libBlue调用new,还是说你的代码创建了一个“newclassdefinedlibgreen(…)”并最终使用libBlue的新操作符?我发布的解决方案(如果可行的话)只适用于后一种情况,由于您没有访问源的权限,因此任何第三方库都无法控制操作员覆盖。

您可以在单独的进程中隔离libBlue.a和libGreen.a,从而有效地创建一个服务器,允许通过某种形式的进程间通信访问封装的功能。这显然对性能有影响,但解决了全局命名空间污染问题。

可以有非技术性的解决方案:

  • 可以将libBlue提供的功能提取到单独的应用程序中
  • 您可以联系libBlue的支持人员。其他人也可能有这个问题
  • 寻找替代方案

  • 另外,如果开发人员在不了解如何解决他们引入的问题的情况下做了一些“聪明”的事情,这是很奇怪的。

    也许您可以研究使用类似于
    objcopy的东西——重新定义sym oldNew=newnewlibblue.a
    。我看到的最大问题是,苹果的开发者工具套件似乎没有包括objcopy。您可以从(
    sudo port install binutils
    )安装objcopy,但该objcopy可能无法操作ARM对象文件。MacPorts中有几个ARM binutils,我猜
    ARM elf binutils
    是最好的选择


    除此之外,您还可以反汇编libBlue.a,用
    sed
    脚本重命名它的新操作符,然后重新组装它。也许您甚至可以直接操作libBlue.a符号表。

    对库进行二进制编辑?如果interweb是可信的,那么它就在。有关详细信息,请参阅

    libBlue.a必须包含导出符号的列表。尝试将其“new”重命名为“neo”或其他名称。libBlue应该在内部保持一致,但是libGreen现在只会在链接时发现系统是“新的”


    或者,libGreen.a必须包含一个未解析符号列表,包括“new”,可能位于
    \u数据、\u la\u symbol\u ptr
    部分。您可以将“new”的实例替换为应用程序中定义的执行相同工作的包装函数的名称。(甚至可能直接调用new,但最终可能返回libBlue。)

    如果“XCode”意味着答案,那么很抱歉,但对于我们其他人来说——你能说明你使用的是什么平台和编译器/链接器吗?XCode意味着MacOSX,带有XCode的编译器/链接器(我不知道它的正确名称)。XCode是MacOSX的IDE,是GCC的前端(特别是在我的系统上,i686-apple-darwin10-gcc-4.2.1)不幸的是,libGreen.a中的代码正在调用new,这最终调用了libBlue.a的新方法。遗憾的是,这是一个客户端应用程序,我无法将其分为多个进程。我能够使用“nEdit”实用程序通过隐藏符号来完成几乎相同的事情。我做了一个“unexport.sym”文件包含在中列出的符号,然后运行:nmedit-R unexport.sym libBlue.o-o libBlue hideen operators.o这似乎成功了!