当前位置:首页 » 编程软件 » ue5源码编译报sdk冲突

ue5源码编译报sdk冲突

发布时间: 2022-12-08 03:32:59

㈠ iOS-集成多个SDK内部文件重复冲突解决

最近使用Hbuilder集成一个项目,集成了很多sdk,发现有两个sdk都是用了Masonry第三方库布局,然后编译报错,关键字: plicate symbol ,出现这个就表示有重复文件了,我们需要把其中的一个sdk文件中生成的重复的.o文件一一删除即可,如下则为相关位置,我将把Masonry.framework的相关重复文件一一移除合并解决冲突问题。

步骤如下:

1.打开终端cd到所要修改的sdk所载文件目录(最好备份一个出来,改完再替换)

2.查看静态库文件包含的架构:

命令: lipo -info  xxxx.a 

主要看看总共有哪些架构有冲突,后面需要一一从相关架构移除。如下

根据结果可以看出包含armv7 i386 x86_64  arm64 这几个库,冲突文件必须从必须从每个架构的库里面相应删除才行,其中x86_64为模拟器的架构,如果不需要模拟器调试,嫌麻烦x86_64可以不管。具体指令集相关可以看这篇文章: https://www.jianshu.com/p/5d1ce5d3d8d6

3.分离出相应架构的库:

命令: lipo -thin armv7 XYRiskAssessment-iOS-1.0.0.a -output armv7.a

例:lipo -thin armv7 Masonry -output Masonry-armv7

然后我们就可以看到我们的sdk目录下会多一个Masonry-armv7的库,如下:

同样的方法我们可以分离出i386  x86_64   arm64 文件分离完成后如下:

4.查看库中所包含的文件列表

命令为: ar -t  xxx.a

例: ar -t  Masonry-armv7

5.如果不清楚两个sdk都有哪些文件重复,可以按照以上步骤,查看下另一个重复的sdk都包含哪些文件,如下所示和Masonry.framework重复的DCUniVideoPublic.framework分离出armv7架构的文件列表,其实也可以在xcode编译重复信息里面找到相关.o文件,看个人喜好。

6.接着我们就要从每个架构文件中,删除相关的冲突.o文件

命令::ar -d -sv XXXXX-armv7.a  XXXX.o

例:

ar -d -sv Masonry-armv7 MASCompositeConstraint.o

ar -d -sv Masonry-armv7 MASViewConstraint.o

7.最后一步:把armv7 i386  x86_64   arm64 所有架构的重复文件按照上面方法删除完成后。我们要把这几个架构合并到原来的库里面

和并静态库的命令:

lipo -create XXXXX-armv7.a XXXXX-armv7s.a (加上所有架构的编译库) -output XXXXX-NOFfmpeg.a

例:

lipo -create Masonry-x86_64 Masonry-armv7 Masonry-i386 Masonry-arm64 -output Masonry

最后将这个新生成的静态库文件替换掉之前的,发现冲突解决。

注意:当把Masonry相关冲突.o文件移除后,这个移除合并后的兼容版本是不能单独拿去使用的,单独使用以上移除的.o文件会出现丢失的编译错误,因为你已经移除了。

觉得有帮助留个赞再走呗 ~

㈡ ue5点击窗口和开始没反应

方法一:卸载冲突软件

这种情况有可能是存在冲突软件引起的。如果你确定这种情况是在安装某个软件之后出现了,那么可以尝试进入安全模式中把这个软件卸载:

按window+R键,弹出运行窗口,输入msconfig调出系统配置窗口:



1.选择引导标签页,勾选安全引导选项。

2.点击确定后重启系统。

3.系统进入安全模式,在安全模式中卸载最近安装后导致任务栏系统图标无法点击的软件。

4.卸载软件之后,同样按照上面的方法调出系统配置窗口,并把安全引导选项勾除。

5.再次重启系统,看看是否问题解决。

方法二:重启window资源管理器

如果你排除是因为软件冲突引起的问题,那么你可以简单尝试下重启window资源管理器。

1.按Ctrl+Alt+Delete键或者右键任务栏菜单调出任务管理器。

2.在任务管理器中找到Widnwo资源管理器,右键菜单选择重启,或者点击右下角重新启动按钮查看情况是否解决。

㈢ 百度sdk和导航的sdk冲突了,怎么办

正常安装情况下不会发生冲突。如果的确有冲突,全部删除(卸载),
重新安装,所有参数让系统自动选择,应该就不会有冲突了。

㈣ ue5打包效果很差

为了能更新到IOS 15 SDK,我们必须将Xcode也升级到13版本之后。连带着的,我的Mac系统也得升级到最新版才能支持Xcode13。(苹果这一套更新流程真的是痛苦)

一切系统、软件都已经升级完毕。我们满心欢喜地通过windows进行远程打包,发现报了一堆variable “***” set but not used 的错误。

而直接在Mac上通过Xcode编译空项目时,竟然也报这个错误。那基本可以断定,最新版的xcode编译条件更加严格,“set but not used”这种不算错误的错误,也被拎出来鞭尸了。

当然,我们可以把没有使用的变量都注释掉以规避掉这个问题,但是在开发测试阶段,变量又很多的情况下这样做非常耗时,更不要说有些未使用变量是部分引擎模块本身就存在的,所以我们还是要解决这个编译设置的问题。

解决方法有很多,大家择一而用就好。(推荐方法二、三)

一、使用较低版本的Xcode(适合纯小白)--亲测可用

Xcode13也是有很多小版本的,经过国内外各位开发者的测试,使用Xcode13.2.1版本你既可以享受最新版本的IOS SDK,你也可以不去管编译设置导致的错误。需要的用户可以直接使用以下链接下载使用。

https://download.developer.apple.com/Developer_Tools/Xcode_13.2.1/Xcode_13.2.1.xip

此方式不需要改代码,适合小白用户。但也仅适合小白用户。因为IOS SDK版本不断升级,以后我们必然还要使用更新的Xcode14、Xcode15 。。。 使用低版本Xcode只能解决眼下问题。

二、更改Unreal项目设置(适合使用mac编译的人)--亲测可用

用xcode打开项目,我们找到项目中的 .target.cs 和 Editor.target.cs,在其中加入以下两行

bOverrideBuildEnvironment = true;
AdditionalCompilerArguments = "-Wno-unused-but-set-variable";
记得两个文件都要改,不要忘记Editor.target.cs。

之后我们重新使用Xcode编译,便可畅通无阻了。

当然,缺点是如果在windows下添加这两行进行远程编译,这是不起作用的,甚至Visual Studio会报Wno-unused-but-set-variable指令无效阻止你重新编译项目。

三、修改Unreal引擎文件(适合用windows进行远程编译的人) --亲测可用

找到Engine/Source/Programs/UnrealBuildTool 目录,双击 UnrealBuildTool.csproj 打开工程(不要求源码版,Launcer版本也可)

定位到工程的Platform/IOS/IOSToolChain.cs文件

在文档中搜索关键词 -Wall

我们删掉-Wall

rebuild一下UnrealBuildTool

关掉UBT工程,重新打开原本的项目,编译、打包一条龙毫无障碍~

在外面玩了好几个月,我终于要回到开发生活当中了。

㈤ 请教库冲突的导致的 plicate symbol 链接错误

场景:
解决TencentOpenAPI.framework与ZbarSDK中 _base64_encode 函数的冲突
后来在网络上搜寻,删除掉 Other Linker Flag 的 -all_load 就可以解决静态库冲突的问题,
但是这样做的话,会使一些外部的静态库,使用objc扩展函数(catagory)的方法失效。例如BaiMapApi
如果是有些库使用到了扩展函数(catagory)可以分别对这个库进行加载
使用:-force_load
-force_load BaiMapApi/libs/Release-iphoneos/libmapapi.a

(BaiMapApi是添加到当前目录下的)

-force_load $(BUILT_PRODUCTS_DIR)/libxxx.a

(这里是直接添加静态库项目源码的做法)
使用-force_load分别进行加载还是蛮方便的,如果有些函数加入了main函数使用all_load就相当麻烦了。
以上可以解决TencentOpenAPI.framework与ZbarSDK的冲突
如果两个静态库冲突的结构是相同的,可以考虑将两个静态库拆分出来进行合并。
查看文件的架构有哪些

$ lipo -info libzbar.a
Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386
将armv7解压出来
lipo libzbar.a -thin armv7 -output libzbar-armv7.a

新建立一个文件夹出来存放解压的(.o)文件

$ mkdir armv7
$ cd armv7
将静态库中的文件解压
$ ar -x ../libzbar-armv7.a
然后将另一个静态库根据以上的步骤做一遍,然后观察连个解压的静态库中,有那些是一样的就合并在一起,不过注意的是两个静态库冲突的(.o)文件必须一致,否则也会出现错误。
合并完后进行打包了
$ libtool -static -o ../libnew-armv7.a *.o
如果像在虚拟机也使用,进行相同的步骤后,将i386的架构合并再一起就可以了。
合并静态库
$ lipo -create -output lib.a libnew-armv76.a libi386.a
plicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在。但是经过一段时间的总结,发现这种错误总是有一些规律可以找的。

例如,我们有如下的最简单的两个类代码:
// ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
// ClassA.m
#import "ClassA.h"
@implementation ClassA
@end
// ClassB.h
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
// ClassB.m
#import "ClassB.h”
@implementation ClassB
@end
编译后出现的错误信息如下:
plicate symbol _OBJC_METACLASS_$_ClassA in:

/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o

/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o
plicate
symbol _OBJC_CLASS_$_ClassA in:
/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o

/Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old:
2
plicate symbols for architecture i386clang:
error: linker command failed with exit code 1 (use -v to see invocation)
从上面出现问题的地方,我们应该能推测出是ClassA这个类出了问题。如果这个类是我们自己写的,就容易办一些。
可以考虑以下原因:
1.引入头文件时,由于疏忽,误引入.m文件。这种一般仔细检查一下出现问题的类的源文件就能发现。
例:ClassB.m 文件修改成下面这样
#import "ClassB.h>"
#import "ClassA.m” // 这句话有问题
@implementation ClassB
@end
2.同一个类,实现两次,即有两个@implementation 。这种一般会有一个警告,也比较容易发现。
例:ClassB.m文件修改成下面这样:
// ClassB.m
#import "ClassB.h”
@implementation ClassB
@end
@implementation ClassA
@end
3.工程文件,同一个类文件被引入了两次,引起这种错误的原因大概有两种:一是多人协作开发时,导致project文件合并冲突;二是同名文件不在同一目录下,添加到工程时造成重复添加。 这种一般在文件视图,用名字过滤器检查一下就发现了。
4.
Targets的Build Phase设置项里,查看Complie
Sources这一项,看看出现问题的类是不是有重复的,用文件名过滤也比较容易发现。这种问题一般也是多人协作开发时,project文件冲突导致的。
发现这种问题,只要删除就可以了。不过在我解决问题过程中,删除其中一个文件时,重复文件会自动全部删除,所以还需要单独添加一下。
5.如果我们的工程中引用了第三方的库,而恰好第三方的库里面有一个ClassA,也会出现这种问题。如果不能修改第三方的库代码,只能修改我信自己的代码了。

㈥ Android 集成三方SDK编译时classes.jar文件冲突

这几天的任务是将mapbox的工程合到程序中去,但是合并过程却出现了问题
合并方法:在app的build.gradle中添加
dependencies {
compile ('com.mapbox.mapboxsdk:mapbox-android-sdk:0.7.4@aar'){
transitive=true
}
}
但是合并后会报错:
Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
这个错误是由于jar包冲突,解决方法如下:
方法一:找到冲突包,将冲突包删除,一般冲突包为'com.android.support:appcompat-v7:22.2.0'或者'com.android.support:support-v4:22.2.0',但是我删除冲突包后,依然报错,于是使用方法二
方法二:因为我的冲突包是'com.android.support:support-v4:22.2.0',所以找到项目根目录-build-intermediates-dex-cache-cache.xml文件,将其中跟v4有关的全部删除,然后clean project,然后将compile改为provided如下:
dependencies {
compile 'com.vividsolutions:jts:1.13'
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.jakewharton:disklrucache:2.0.2'
provided 'com.android.support:support-v4:21.0.0'
}

㈦ 编译的时候找不到 SDK库中的头文件怎么办

一,引入第三方sdk时找不到头文件问题:
我在mac mini,Xcode6.x的环境下引入了第三方SDK,同Xcode自带的framework同放在工程的Frameworks路径下,想在代码中使用第三方SDK时发现找不到,而系统的framework却能够找到,解决办法:
在Build Settings里搜索Search Paths 发现里面Library Search Paths 中没有生成刚引进的SDK路径,自己手动添加上去(系统自带的framework不需要添加),将里面Library
Search Paths 中没有用到的地址删除,如图:framework5是引入的第三方:
再回头看,是否能够引用到了第三方的库,如果还没有,那么将你第三方SDK对应的framework5放到最外层文件夹,再对应的重新定位Framework Search Paths,能够找到了吧!
二:好了,头文件找到了,coding。。。然后编译运行,发现报错“_OBJC_CLASS_$_某文件名", referenced from:xx ”;
出这个错是因为Xcode没能自动把“_OBJC_CLASS_$_某文件名", referenced from:xx ”中的“ 某文件名 ”编译进去,又需要手动去弄了,实现的部分可以是。framwork也可以是源码文件,解决办法,打开Project Target-》Build Phases,将“某文件” 拖到对应的位置,(如果是源码文件拖到Compile Sources,如果是在。framework中,则将framework拖到Lind Binary With Libraries),如图:
再编译,如果再报错,
1,那么再阅读你所使用的第三方SDK文档,有的引入需要依赖于系统的framework,请按照说明将Xcode自带的framework引入即可;
2,还有一种可能,静态库一般有两个,一个真机调用的,一个模拟器调用的。在真机调试时使用模拟器专用的库或反之都会报错,你可以将它们编译成真机和模拟器都能使用的静态库,方法这里不细说。

㈧ 百度sdk和导航的sdk冲突了,怎么办

如果你不是很懂,那就只能使用其中之一,如果你很懂程序,将冲突的地方改过来即可

望采纳

㈨ 微信支付sdk接入依赖冲突

接入错误。当导入微信的支付SDK时,不会发生冲突,但是因为librarysearchpaths里面ShareSDK里面的微信SDK在前面,这就导致覆盖了我们导入的微信SDK,会导致出现接入依赖冲突的问题,微信是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序。

㈩ ios 自己封装的sdk引入了第三方库,怎么防止与外界的冲突

jQuery是目前使用最广泛的前端框架之一,有大量的第三方库和插件基于它开发。为了避免全局命名空间污染,jQuery提供了jQuery/ajax/libs/jquery/1/ajax/libs/jquery/1/ajax/libs/jquery/1/ajax/libs/jquery/1.6.4/jquery.min.js"> <!-- jQuery and $ now point to jQuery 1.6.4 --> <script>var jquery164 = jQuery.noConflict( true );</script> <!-- jQuery now points to jQuery 1.7.0; $ now points to jQuery 1.10.2; jquery164 points to jQuery 1.6.4 --> 避免第三方库的冲突 以上的代码片段展示了如何解决多版本jQuery的冲突。接下来,我们尝试解决jQuery库和第三方库的冲突,下面出现的代码片段在jQuery的官方文档中都有,有兴趣的程序猿可以仔细阅读官方文档体会其中的区别。 直接使用No-Conflict模式 使用No-Conflict模式,其实就是对jQuery进行重命名,再调用。 <!-- 采用no-conflict模式,jquery.js在prototype.js之后被引入. --> <script src="prototype.js"></script> <script src="jquery.js"></script> <script> var $j = jQuery.noConflict(); // $j 引用了jQuery对象本身. $j(document).ready(function() { $j( "div" ).hide(); }); // $ 被重新指向prototype.js里定义的对象 // document.getElementById(). mainDiv below is a DOM element, not a jQuery object. window.onload = function() { var mainDiv = $( "main" ); } </script> 使用自执行函数封装 使用这种方式,你可以在匿名函数内部继续使用标准的$对象,这也是众多jQuery插件采用的方法。需要注意的是,使用这种方法,函数内部无法再使用prototype.js定义的$对象了。 <!-- jquery.js在prototype.js之后被引入. --> <script src="prototype.js"></script> <script src="jquery.js"></script> <script> jQuery.noConflict(); (function( $ ) { // Your jQuery code here, using the $ })( jQuery ); </script> 使用标准jQuery(document).ready()函数 如果jQuery库在其它库之前引入,那么jQuery内部定义的jQuery和$会被第三方库覆盖,这时候再使用noConflict()已经没有什么意义了。解决的方法很简单,直接使用jQuery的标准调用方式。 <!-- jquery.js在prototype.js之前被引入. --> <script src="jquery.js"></script> <script src="prototype.js"></script> <script> // Use full jQuery function name to reference jQuery. jQuery( document ).ready(function() { jQuery( "div" ).hide(); }); // 或者 jQuery(function($){ // Your jQuery code here, using the $ }); // Use the $ variable as defined in prototype.js window.onload = function() { var mainDiv = $( "main" ); }; </script> 下面给大家介绍jQuery noConflict() 方法 noConflict() 方法会释放会 $ 标识符的控制,这样其他脚本就可以使用它了。 实例 当然,您仍然可以通过全名替代简写的方式来使用 jQuery: $.noConflict(); jQuery(document).ready(function(){ jQuery("button").click(function(){ jQuery("p").text("jQuery 仍在运行!"); }); }); 实例 您也可以创建自己的简写。noConflict() 可返回对 jQuery 的引用,您可以把它存入变量,以供稍后使用。请看这个例子: var jq = $.noConflict(); jq(document).ready(function(){ jq("button").click(function(){ jq("p").text("jQuery 仍在运行!"); }); }); 实例 如果你的 jQuery 代码块使用 $ 简写,并且您不愿意改变这个快捷方式,那么您可以把 $ 符号作为变量传递给 ready 方法。这样就可以在函数内使用 $ 符号了 - 而在函数外,依旧不得不使用 "jQuery": $.noConflict(); jQuery(document).ready(function($){ $("button").click(function(){ $("p").text("jQuery 仍在运行!"); }); });

热点内容
安卓咪咕音乐怎么录制视频 发布:2024-05-19 07:56:06 浏览:838
如何搞出超大声的听声辨位安卓版 发布:2024-05-19 07:46:21 浏览:927
linux安全模式 发布:2024-05-19 07:27:25 浏览:176
为什么安卓手机安装不了cpk 发布:2024-05-19 07:22:21 浏览:313
pythonempty 发布:2024-05-19 07:15:16 浏览:930
路由器虚拟服务器搭建 发布:2024-05-19 07:15:15 浏览:999
方舟编译器何时推送 发布:2024-05-19 07:15:10 浏览:599
魔兽世界自动钓鱼脚本 发布:2024-05-19 06:43:07 浏览:496
cbs加密 发布:2024-05-19 06:29:56 浏览:203
ssis存储过程 发布:2024-05-19 06:21:31 浏览:632