前言
由于修改了PhysX,需要重编一遍各平台的库,做此记录。
基于 UE4.26 的各平台(PC、Android、IOS、Mac)PhysX编译。
PC Win64 编译
一、环境要求:VS2015
默认支持2015,其他版本VS需自行摸索环境配置
安装时勾选
- Win10SDK
- Comon Tools for Visual C++2015
二、构建工程
-
打开 Engine\Source\ThirdParty\PhysX3\BuildProfile_Win64.bat
里面加上P4空间名,set uebp_CLIENT=XXX
如果想不设置P4,则需修改AutomationTool工程中 BuildPhysX.Automation.cs 的[RequireP4]后Rebuild,再执行该bat(详见 Mac 编译中的修改)。 -
运行 ./BuildProfile_Win64.bat,得到
PhysX3\APEX_1.4 中的 ThirdParty\PhysX3\APEX_1.4\compiler\windows\VS2015\Apex.sln
三、编译提交
- 修改BuildProfile_Win64.bat 中 -TargetConfigs=release+profile+checked(按需选择,使用+分隔,同时生成多个配置),参数不加-SkipBuild,就会直接构建工程+build
(也可以打开 Apex.sln,把release+profile+checked 配置分别选一遍Rebuild) - 生成内容:
- 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 ,也能编过
二、修改
- 编译报错 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不一样导致的。 - 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库
- 参数选择
- TargetConfigs:可用+连接,默认 release+profile+checked+debug (release会清空lib目录,需要放在最前面)
- TargetPlatforms:对于安卓,该参数值需为 Android-{$Architecture},可用+号连接,表示一次构建多个平台的。
Architecture 有以下四种可以选(注意默认就是armv7的参数,如果填写的Architecture大小写没匹配上,会生成对应的目录,但实际lib是armv7的版本):
- 使用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 即可构建
但有如下问题需解决
-
运行BuildForMac.command时,报错找不到RunUAT.sh
解决方法:原本RunUAT.sh 应该是直接在 UE4.sln 同目录,现在挪到 ./Engine/Build/BatchFiles,修正 BuildForMac.command 中RunUAT.sh 路径为 ./Engine/Build/BatchFiles/RunUAT.sh -
运行脚本报错需要P4,去掉 BuildPhysX.Automation.cs 中 RequireP4 ,重编一次AutomationTool工程后再使用
AutomationTool工程路径:Engine/Source/Programs/AutomationTool/AutomationTool_Mono.sln
Rebuild "AutomationTool"就行,很快就完成,不用rebuild带Mono的工程。 -
新版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中加入方便。
- 新版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
二、修改
- BuildPhysX.Automation.cs 中 [RequireP4] 去掉,跟第2步一同修改Rebuild。
- 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 中设置
- 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不支持了,需移除
- 各种-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
其他问题记录
-
Cmake 报错 the matching SDK does not exist
Mac编译也有,但能正常编出,应该不影响 -
注意不要通过远程桌面直接从win拷贝文件到mac,应该是格式有差别,command文件会无法执行,会报错。
同时拷贝单独的字符串过去,也得删除最后一个奇怪的字符(cmakelists.txt用vs code打开会显示,有的文本编辑器里不会显示) -
由于移除了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
- 与Android一样,编译release版时,会清空lib目录,所以多个版本同时编译,需把release放在最前面,Mac同理。