虚幻引擎在Linux平台打包时,遇到std::__1::basic_string报错的解决方法

Posted Dandified

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚幻引擎在Linux平台打包时,遇到std::__1::basic_string报错的解决方法相关的知识,希望对你有一定的参考价值。

 一、背景

        最近因为项目需求,需要在虚幻引擎中使用RabbitMQ,并且在Linux平台上进行部署。

        因为SimpleAmqpClient需要的库文件和头文件较多,为了方便起见,我选择将AMQP-CPP以插件的形式整合进虚幻引擎。

        但当一切功能在引擎里调试完毕后(Windows 平台),在进行Linux交叉编译时,linking的时候会遇到以下报错:

UATHelper: Packaging (Linux):     ld.lld: error: undefined symbol: AMQP::ConnectionImpl::ConnectionImpl(AMQP::Connection*, AMQP::ConnectionHandler*, AMQP::Login const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)

UATHelper: Packaging (Linux):     >>> referenced by connection.h:47 

        在查阅资料后,发现这个问题主要源于std::__1::basic_string,这个类的定义出自于libstdc++。而UE在交叉编译时,链接的库为libc++,若第三方库编译时链接的为libstdc++,会引起此报错。因此,我们只需要保证第三方库在编译时链接的标准库为libc++即可。

二、解决方法

        为了解决上述问题,在Linux中,一般是使用CMake来进行编译,所以我们需要修改CMakeLists.txt文件,来指认编译器和链接库,使之与虚幻引擎一致。

1、修改编译器为 Clang / Clang++

        在CMakeLists.txt中添加如下字段,此段内容一定要放在 project() 声明前!

SET (CMAKE_C_COMPILER             "/usr/bin/clang")
SET (CMAKE_C_FLAGS                "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG          "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE        "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

SET (CMAKE_CXX_COMPILER             "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS                "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG          "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

SET (CMAKE_AR      "/usr/bin/llvm-ar")
SET (CMAKE_LINKER  "/usr/bin/llvm-ld")
SET (CMAKE_NM      "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB  "/usr/bin/llvm-ranlib")

        除了上述方法,也可以永久指定Linux默认编译器为Clang,通过下述指令即可(以 Ubuntu 为例),

sudo update-alternatives --config c++

        执行后,便可以输入编号选择clang作为默认编译器。

2、指定链接的标准库为libc++

        在CMakeLists.txt中添加如下字段,

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -stdlib=libc++ -v")
set(CMAKE_EXE_LINKER_FLAGS "$CMAKE_EXE_LINKER_FLAGS -stdlib=libc++ -lc++abi")

        此字段将编译和链接时的标准库都设置为libc++,因此最后的编译结果均与虚幻引擎兼容。

        以上步骤设置后,在对应的build文件夹执行

cmake ..
make

        便可编译出我们需要的第三方库了。

在虚幻引擎5中构建你的首款游戏 - 10[完] - 特效&音效&镜头震动&打包

在虚幻引擎5中构建你的首款游戏 - 10[完] - 特效&音效&镜头震动&打包

前言介绍:

原版地址: << [功能亮点]在虚幻引擎5中构建你的首款游戏(官方字幕)_哔哩哔哩_bilibili >>

<< https://www.bilibili.com/video/BV1M34y1x7tc >>

官网地址: << Your First Game In Unreal Engine 5 | Tutorial (epicgames.com) >>

<< https://dev.epicgames.com/community/learning/tutorials/e2V/your-first-game-in-unreal-engine-5 >>

所处时间段: [01:13:23] ~ [01:23:36] ;

主要内容: 特效&音效&镜头震动,最后我扩展一下打包内容.

1.粒子特效

  • 创建新的文件夹Effects存放特效资产,右键选择创建Niagara系统,选择空白模板,命名为FX_Dust.双击打开,得到类似材质创建的界面.

1.1.设置单次播放

  • 先选择节点中的最后一项:System State(系统状态),然后在右边的设置栏目中修改Loop Behavior(循环行为)Once(一次).意为该特效只播放一次,不会循环.

1.2.添加(粒子)发射器

  • (右键)添加发射器-(选择)Empty,为空白模板.

1.3.添加粒子爆炸

  • 在节点的发射器更新栏中点击加号图标,添加Spawn Burst Instantaneous(产生破裂的瞬间),注释为,瞬间产生一股粒子爆炸。选中后在右边设置粒子数目为10.

1.4.粒子属性

  • 选择粒子生成中的Initialize Particle(初始化粒子),在右边栏中设置,从上到下分别为:颜色模式,质量模式,随机尺寸大小.

1.5.粒子速度

  • 粒子生成中选择添加Add Velocity(增加速度),选中后设置右边的内容.一开始会提示报错需要修复,点修复即可.如何修改2个地方,从上到下是:速度模式,速度大小.改为负数就朝后运动.这时已经可以在左边的预览窗口看到运动的粒子效果了.

1.6.放大效果

  • 粒子更新中搜索Scale Sprite Size(Scale规模大小)添加.然后在右边设置变化曲线,和时间轴设置类似,选中第二个关键字,然后设置y轴坐标,代表放大1秒后放大15倍.能看到预览有放大效果.

1.7.增大噪点

  • 粒子更新中搜索Curl Noise Force(旋度噪音力)添加,然后右边设置增大噪点.

1.8.设置重力

  • 粒子更新中搜索Gravity Force(重力)添加,设置z轴为正数,代表粒子会向上飘.和之前设置的粒子质量结合生效.

1.9.透明度

  • 粒子更新中搜索Scale Color(Scale的颜色)添加,然后右边点击Scale Alpha(的透明度)添加Float from Curve曲线,然后点击第二个关键帧,设置x轴坐标,缩短时间.

  • 这样就算差不多完成了.接下来和人物动画结合.

2.与动画结合

  • 打开之前导入的奔跑动画,可以在下面轨道1中右键添加Niagara粒子效果.

  • 然后选择添加的关键帧后可以在右栏细节中选择刚刚创建的粒子特效文件,即可生效.但是生效的位置不太对,可以在下方输入骨骼的名字,会指定特效生成的起始点.定位到右脚即可.左脚同理.

  • 这样就算完成了,运行查看效果.AI和角色都有生成粒子特效.

3.音效

  • 在左上角编辑-插件中输入metasound搜索到制作音效的插件,点击启用并重启ue5.

  • 然后创建新文件夹Audio存放音效资产,右键选择音效-MetaSound源创建,命名为SFX_FootStep.

  • 然后双击打开,类似材质和特效编辑器一样,使用蓝图凭空生成一些特效.先加入一个噪声noise节点,选择白噪声white noise类型.连接播放后就可以播放听听效果了.

  • 然后最终蓝图逻辑设置如下.播放后的效果就是短促的噪声,类似踩草地的声音.这样就算完成音效了.

  • 回到奔跑的动画中,先添加一条新的通知频道,然后就和添加特效一样,添加音效关键帧.

  • 播放动画,或是运行游戏就能看到效果了.

4.镜头震动

  • 在文件夹Effects内创建新的蓝图文件,在所有类中搜索DefaultCameraShakeBase,创建后命名为CameraShake.

  • 双击打开,设置属性.你的界面可能是纯数据蓝图,只有细节选择.都一样的.

  • 设置好后,打开开关门的蓝图(可以在场景中点击门后按快捷键CTRL+B快速定位),然后对事件图表做出一下修改,增加2个节点,选择刚刚创建的蓝图,设置参数.

  • 弄好后就可以运行游戏看看效果.至此该教程视频的内容全部结束.

5.总结

  • 这就是教程视频的最后一节内容了.
  • 不过我还要扩展一点,讲讲一游戏打包的内容.
  • 接下来可以去看看其他游戏案例,做个起码能玩的游戏出来,小破站有挺多up开始做这样的系列教程.

6.游戏打包(扩展)

  • 这里只针对一下win10以上的windows系统.
  • 首先,你能在epic的界面看到ue5的选项里有目标平台可以选择.但是没有windows的选择,很奇怪.

  • 然后你可以在项目设置里找到一些关于windows打包的设置.

  • 主要是在主界面有个平台图表,点击后能看到当前支持的打包情况.下图是显示我已经安装好环境的情况.如果你没安装好,会全是感叹号.还会有个自动修复功能,但是没有用,点击后弹出控制台报错.

  • 我找了很多方法,都不大有效,下面这个比较少踩坑,虽然也是无效了,或者说不是重点.

推荐参考: << UE5缺少SDK,而无法在windows平台打包的解决方法 - 知乎 (zhihu.com) >>

  • 上面的帖子介绍的3种方法我都试过,记录一下我踩的坑.

    1. 使用ue5自带的更新帮助,报错无效;
    2. 直接安装windows10的SDK,一开始是安装下载器下载,巨慢.后来直接下载iso文件,一下子好了.但是依然报错无效;报错提示中说明要安装新SDK文件.根据提示提供的网址下载安装,还是不行.
    3. 安装.NET,手贱选择了5.0版本,还是报错无效.再安装.NET Core 3.1,终于成功识别到框架了,也能识别到我安装的windows10SDK.能进入打包步骤,但是中途报错.
  • 虽然上面一顿操作还是失败了,不过起码能进入打包步骤了.最后我根据报错提示搜索得知,原来最后一步还差一个vs2019…使用ue5中自带的安装功能.在第一节就说过了,如果你没安装vs2019,在新建工程时选择c++模式的话,会提示安装.

推荐参考: << 关于ue4打包出错的一些记录 仅供参考 - 哔哩哔哩 (bilibili.com) >>

  • 安装完vs2019后才终于大功告成,能正常打包了.到这里就成了冤大头了,之前的步骤都是白费的.因为vs2019安装时会自带选择安装.NET Core 3.1windows10SDK!!!
  • 所以建议还是直接使用ue5自带的安装vs2019功能,安装windows打包环境.下面是打包成功的输出日志.

  • 然后找到打包路径,启动游戏就好了.小小的demo,就把我的3060跑满了,ue5没优化的游戏恐怖如斯.

  • [完]

以上是关于虚幻引擎在Linux平台打包时,遇到std::__1::basic_string报错的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

在虚幻引擎5中构建你的首款游戏 - 10[完] - 特效&音效&镜头震动&打包

在虚幻引擎5中构建你的首款游戏 - 10[完] - 特效&音效&镜头震动&打包

大象无形_虚幻引擎程序设计浅析pdf

虚幻引擎UEUE5 实现WEB和UE通讯思路(含工程源码)

ue4 虚幻四引擎项目无法打包,求帮助!

在虚幻引擎5中构建你的首款游戏 - 05 - 岩石和植物