UE4 PhysX源码 多平台编译

前言

由于修改了PhysX,需要重编一遍各平台的库,做此记录。
基于 UE4.26 的各平台(PC、Android、IOS、Mac)PhysX编译。

PC Win64 编译

一、环境要求:VS2015

默认支持2015,其他版本VS需自行摸索环境配置
安装时勾选

  • Win10SDK
  • Comon Tools for Visual C++2015
    Comon Tools for Visual C++2015
    在这里插入图片描述

二、构建工程

  1. 打开 Engine\Source\ThirdParty\PhysX3\BuildProfile_Win64.bat
    里面加上P4空间名,set uebp_CLIENT=XXX
    在这里插入图片描述
    如果想不设置P4,则需修改AutomationTool工程中 BuildPhysX.Automation.cs 的[RequireP4]后Rebuild,再执行该bat(详见 Mac 编译中的修改)。

  2. 运行 ./BuildProfile_Win64.bat,得到
    PhysX3\APEX_1.4 中的 ThirdParty\PhysX3\APEX_1.4\compiler\windows\VS2015\Apex.sln

三、编译提交

  1. 修改BuildProfile_Win64.bat 中 -TargetConfigs=release+profile+checked(按需选择,使用+分隔,同时生成多个配置),参数不加-SkipBuild,就会直接构建工程+build
    (也可以打开 Apex.sln,把release+profile+checked 配置分别选一遍Rebuild)
  2. 生成内容:
  • Engine\Binaries\ThirdParty\PhysX3\Win64\VS2015 中的 dll 与 pdb
  • Engine\Source\ThirdParty\PhysX3\Lib\Win64\VS2015 中有静态库 lib

Android 编译

虽然 UE 的 ThirdParty\PhysX3 中有一个文档 readme_android.html,但这个其实是PhysX官方的文档,UE这边经过自己包装,已经是把编译PhysX实现到 AutomationTool 中,对应模块是 BuildPhysX.Automation.cs。
(如需调试该流程,参考官方文档)
文件头有部分参数说明
在这里插入图片描述

一、环境要求

直接使用UE4自带的Android相关库,可在环境变量中加入该配置(或者单独安装配置也行)

  • ANDROID_HOME:{$Engine}\Source\Script\Resource\AndroidStudio\Sdk
  • NDKROOT:{$Engine}\Source\Script\Resource\AndroidStudio\Sdk\ndk\21.4.7075529
  • NDK_ROOT:{$Engine}\Source\Script\Resource\AndroidStudio\Sdk\ndk\21.4.7075529
  • JAVA_HOME:jdk的jre目录,我本地装的比较新的AndroidStudio,已经没有jre目录了,填的 AndroidStudio\jbr\bin ,也能编过

二、修改

  1. 编译报错 ThirdParty/PhysX/PhysX-3.3/include\foundation/unix/PxUnixIntrinsics.h(92,10): error : use of undeclared identifier ‘isfinite’; did you mean ‘::isfinite’?
    ThirdParty\PhysX3\PxShared\include\foundation\unix\PxUnixIntrinsics.h 中 std::isfinite 去掉,改为 ::isfinite,应该是使用的CRT不一样导致的。
  2. noreturn warning 被视作 error
    ThirdParty\PhysX3\PxShared\src\foundation\include\PsUtilities.h 中忽略 -Winvalid-noreturn 的警告
    或者在
    PhysX3\PxShared\src\compiler\cmake\android\CMakeLists.txt 中添加 add_compile_options(-Wno-invalid-noreturn) 屏蔽。

三、构建PhysX库

  1. 参数选择
  • TargetConfigs:可用+连接,默认 release+profile+checked+debug (release会清空lib目录,需要放在最前面)
  • TargetPlatforms:对于安卓,该参数值需为 Android-{$Architecture},可用+号连接,表示一次构建多个平台的。
    Architecture 有以下四种可以选(注意默认就是armv7的参数,如果填写的Architecture大小写没匹配上,会生成对应的目录,但实际lib是armv7的版本):
    在这里插入图片描述
  1. 使用UAT构建,同Win64,需要先设置P4 workspace名(同Win64,不想设置则改UAT工程),脚本如下,自行修改TargetPlatforms、TargetConfigs参数
@echo off
set uebp_CLIENT=YourWorkSpace
pushd ..\..\..\Build\BatchFiles
call RunUAT.bat BuildPhysX -TargetPlatforms=Android-x64+Android-arm64 -TargetConfigs=release+profile+checked -SkipCreateChangelist
popd
  • 构建成功会有 BUILD SUCCESSFUL 提示,虽然有两个编译选项的error(-funswitch-loops、-finline-limit=300),但这两选项不影响功能,从 Engine\Programs\AutomationTool\Saved\Logs 的构建 Log.txt 中可以看到使用的是UE中的clang和clang++,按理没问题
    • Utils.LocalProcessOutput: – Using CXX Compiler: XXX/Source/Script/Resource/AndroidStudio/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe

四、提交

输出的内容在 Engine\Source\ThirdParty\PhysX3\Lib\Android 下
大小比原本的略小一些、

Mac 编译

一、环境要求

直接到部署过引擎的mac机上编译即可,用最新的XCode,使用的clang估计XCode带的,路径:/usr/bin/clang。
Mac需构建 PhysX、Apex、NavCloth,详见BuildPhysX.Automation.cs
在这里插入图片描述

二、修改

直接运行 Engine\Source\ThirdParty\PhysX3\BuildForUE\Mac\BuildForMac.command 即可构建
但有如下问题需解决

  1. 运行BuildForMac.command时,报错找不到RunUAT.sh
    解决方法:原本RunUAT.sh 应该是直接在 UE4.sln 同目录,现在挪到 ./Engine/Build/BatchFiles,修正 BuildForMac.command 中RunUAT.sh 路径为 ./Engine/Build/BatchFiles/RunUAT.sh

  2. 运行脚本报错需要P4,去掉 BuildPhysX.Automation.cs 中 RequireP4 ,重编一次AutomationTool工程后再使用
    AutomationTool工程路径:Engine/Source/Programs/AutomationTool/AutomationTool_Mono.sln
    Rebuild "AutomationTool"就行,很快就完成,不用rebuild带Mono的工程。

  3. 新版XCode更为严格,各种Warning被视作error

  • PhysX3.4 中Warning
    解决方法:PhysX_3.4\Source\compiler\cmake\mac\CMakeLists.txt中加入以下编译选项
    add_compile_options(-Wno-suggest-override)
    add_compile_options(-Wno-suggest-destructor-override)
    add_compile_options(-Wno-dtor-name)
    add_compile_options(-Wno-unused-but-set-variable)

  • APEX 中Warning
    解决方法:APEX_1.4\compiler\cmake\mac\CMakeLists.txt中加入以下编译选项
    add_compile_options(-Wno-unused-but-set-variable)
    add_compile_options(-Wno-shorten-64-to-32)

  • NavCloth 中Warning
    解决方法:PhysX3\NvCloth\compiler\cmake\mac\CMakeLists.txt中加入以下编译选项
    add_compile_options(-Wno-suggest-override)
    add_compile_options(-Wno-suggest-destructor-override)
    add_compile_options(-Wno-unused-but-set-variable)

如果要逐个文件解决,需要改很多个,直接CMake中加入方便。

  1. 新版XCode编译报错:
error: argument value 2 is outside the valid range [0, 1]

涨姿势的解决方法:https://github.com/EmbarkStudios/physx-rs/issues/133
也在这贴一下

if(index < 2)
{
	return vdupq_lane_f32(vget_low_f32(a), index);
}

改为

if(index == 0)
{
    return vdupq_lane_f32(vget_low_f32(a), 0);
}
else if(index == 1)
{
    return vdupq_lane_f32(vget_low_f32(a), 1);
}

三、提交

  • Engine\Source\ThirdParty\PhysX3\Lib\Mac 下Lib
  • Engine\Binaries\ThirdParty\PhysX3\Mac 下 dylib

IOS 编译

一、环境要求

同Mac,把BuildForMac.command拷贝出来,改名BuildForIOS.command(大部分都可以删掉,留着应该也不影响),
关键改RunUAT.sh的路径 和 TargetPlatforms=IOS

二、修改

  1. BuildPhysX.Automation.cs 中 [RequireP4] 去掉,跟第2步一同修改Rebuild。
  2. cmake时,找不到CMAKE_CXX_COMPILER
  • 判断思路:编mac是成功的,一样需要用到XCode和clang,检查mac的输出,是用的是机器上的clang++,说明环境是有的。
    在这里插入图片描述

在IOS的CMakeLists.txt中加入设置CMAKE_CXX_COMPILER的语句,发现无效,而且还没走到该语句,
再对比了下AutomationTool中Mac跟IOS的配置,发现Mac多Override了GetAdditionalCMakeArguments,加上后Rebuild成功。

  • 解决方法:参照 BuildPhysX_MacBase,
    为 Engine\Source\Programs\AutomationTool\Scripts\BuildPhysX.Automation.cs 中的BuildPhysX_IOS 添加 GetAdditionalCMakeArguments,
public override string GetAdditionalCMakeArguments(BuildPhysX.PhysXTargetLib TargetLib, string TargetConfiguration)
{
   return string.Format(" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++");
}

然后Rebuild AutomationTool(参照Mac中修改2)

-DCMAKE_OSX_ARCHITECTURES 不需要加,架构在 PhysX3\PhysX_3.4\Source\compiler\cmake\ios\CMakeLists.txt 和
PhysX3\PxShared\src\compiler\cmake\ios\CMakeLists.txt 中设置

  1. cmake 报armv7、armv7s的Error
    PhysX3\PhysX_3.4\Source\compiler\cmake\ios\CMakeLists.txt 和
    PhysX3\PxShared\src\compiler\cmake\ios\CMakeLists.txt 中设置
    在这里插入图片描述

armv7、armv7s 是原来32位的架构,现在XCode不支持了,需移除

  1. 各种-Werror

PhysX3\PhysX_3.4\Source\compiler\cmake\ios\CMakeLists.txt 中加入

add_compile_options(-Wno-suggest-destructor-override)
add_compile_options(-Wno-atomic-implicit-seq-cst)
add_compile_options(-Wno-alloca)
add_compile_options(-Wno-suggest-override)
add_compile_options(-Wno-dtor-name)
add_compile_options(-Wno-unused-but-set-variable)        
add_compile_options(-Wno-anon-enum-enum-conversion)

PhysX3\PxShared\src\compiler\cmake\ios\CMakeLists.txt 中加入

add_compile_options(-Wno-atomic-implicit-seq-cst)

三、提交

Engine\Source\ThirdParty\PhysX3\Lib\IOS 下 lib

其他问题记录

  1. Cmake 报错 the matching SDK does not exist
    Mac编译也有,但能正常编出,应该不影响

  2. 注意不要通过远程桌面直接从win拷贝文件到mac,应该是格式有差别,command文件会无法执行,会报错。
    同时拷贝单独的字符串过去,也得删除最后一个奇怪的字符(cmakelists.txt用vs code打开会显示,有的文本编辑器里不会显示)

  3. 由于移除了armv7、armv7s两种架构,最终lib会只有原来的三分之一大小,正常现象
    通常可用

 ar t YourLib.a 

查看静态库中的文件,对于原本三架构合一的lib,会提示

ar : is a fat file (use libtool(1) or lipo(1) and ar(1) on it)

可使用以下指令将对应架构提取为单独的静态库,继而查看内容

lipo libYourLib. a -thin armv6 -output libYourLibarmv6.a
  1. 与Android一样,编译release版时,会清空lib目录,所以多个版本同时编译,需把release放在最前面,Mac同理。
  • 31
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要设置UE源码编译平台,需要按照以下步骤进行操作。 1. 获取Unreal Engine源代码。可以通过Epic Games的GitHub仓库或者Unreal Engine官网下载源代码压缩包。 2. 解压缩源代码到本地计算机的合适位置。 3. 安装必要的软件和工具。编译Unreal Engine需要一些依赖软件和工具,例如Visual Studio(推荐使用VS2017或更高版本)、Windows SDK、DirectX、CMake等。根据Unreal Engine版本和所需功能进行适当安装。 4. 打开解压缩后的源代码目录,找到Setup.bat文件并运行。此脚本将执行一系列设置和配置操作,以确保编译环境的正确性。 5. 选择要编译的目标平台。根据项目需求,使用Setup.bat脚本提供的选项选择要编译的目标平台,例如Windows、Mac、Linux等。 6. 使用CMake生成项目文件。在源代码目录中,找到GenerateProjectFiles.bat文件并运行。此脚本将使用CMake生成项目文件。 7. 打开生成的项目文件。根据所用的开发工具,例如Visual Studio,使用生成的项目文件打开Unreal Engine。这将加载Unreal Engine的代码,并准备进行编译。 8. 编译Unreal Engine。使用开发工具进行编译,确保选择正确的编译配置和目标平台编译过程可能需要一些时间,具体时间取决于计算机性能和项目大小。 9. 完成编译后,可以开始使用编译后的Unreal Engine。根据需要,可以运行自己的项目或者使用Unreal Engine进行开发或测试。 需要注意的是,UE源码编译平台的设置过程可能会因个人计算机的配置和项目需求而略有差异。建议在参考官方文档和社区参考资料的基础上进行设置,并根据实际情况调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值