UE5 SLua插件在Mac环境的支持

本文主要讲UE5项目导入SLua插件后,在Mac上编译无法通过的一些问题和解决方案。

前情提要

首先我的Mac环境是 M1芯片,macOS版本为15.4.1
在这里插入图片描述

Xcode版本是16.3
在这里插入图片描述

问题描述

问题1:

导入SLua插件后,首先第一个报错就是关于log代码的断言报错:
FormatStringSan.h(99, 3): static assertion failed due to requirement ‘bFmtStrErr<UE::Core::Private::FormatStringSan::TAtArgPos<0>>’: ‘%s’ expects TCHAR*; use ‘%hs’ for const char*.
在这里插入图片描述

问题2:

解决了上面的报错后,又有一个关于找不到arm64架构的新报错:
clang++: Error : linker command failed with exit code 1 (use -v to see invocation)在这里插入图片描述
再往前翻找,还有一些警告提示:

0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(wsocket.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(usocket.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(unix.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(udp.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(timeout.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(tcp.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(serial.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(select.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(options.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(mime.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(luasocket.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(io.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(inet.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(except.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(buffer.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(auxiliar.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lzio.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lvm.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lutf8lib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lundump.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(ltm.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(ltablib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(ltable.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lstrlib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lstring.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lstate.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lparser.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(loslib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lopcodes.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lobject.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(loadlib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lmem.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lmathlib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(llex.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(liolib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(linit.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lgc.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lfunc.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(ldump.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(ldo.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(ldebug.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(ldblib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lctype.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lcorolib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lcode.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lbitlib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lbaselib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lauxlib.o)': found architecture 'x86_64', required architecture 'arm64'
0>ld: Warning  : ignoring file '/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/Library/Mac/liblua.a(lapi.o)': found architecture 'x86_64', required architecture 'arm64'
0>Undefined symbols for architecture arm64:

原因分析:

1.关于log代码的断言报错,主要是因为Mac对语法的检查更严格,遇到一些类型转换时需要更加显式。

2.关于找不到arm64架构的报错,主要是因为官方的SLua只有已编译好的x86架构的liblua.a库,而没有arm64架构的liblua.a库。而我的电脑正好是M1芯片,是属于arm64架构的,所以需要自己手动编译一个arm64架构的liblua.a库。


解决方案:

1.关于log代码的断言报错

如果贪图方便的话,那只需要注释掉output里面这几行就行了,不过这个Log类不知道会不会与后续写lua查bug定位的日志有关。
在这里插入图片描述
所以为了稳妥起见,写一个宏,在mac平台上换另一种处理方式,就是把类型转换写得更明确些,就像下面这样:


#if PLATFORM_WINDOWS
    void output(LogLevel level,const wchar_t* buf) {
        switch(level) {
            case LogLevel::LL_Debug:
                UE_LOG(Slua, Verbose, TEXT("%s"), buf);
                break;
            case LogLevel::LL_Log:
                UE_LOG(Slua, Log, TEXT("%s"), buf);
                break;
            case LogLevel::LL_Error:
                UE_LOG(Slua, Error, TEXT("%s"), buf);
                break;
        default:
            UE_LOG(Slua, Log, TEXT("%s"), buf);
        }
    }
#else
    void output(LogLevel level,const wchar_t* buf) {
        FString ConvertedText = FString(UTF8_TO_TCHAR(TCHAR_TO_UTF8(buf)));
        switch(level) {
            case LogLevel::LL_Debug:
                UE_LOG(Slua, Verbose, TEXT("%s"), *ConvertedText);
                break;
            case LogLevel::LL_Log:
                UE_LOG(Slua, Log, TEXT("%s"), *ConvertedText);
                break;
            case LogLevel::LL_Error:
                UE_LOG(Slua, Error, TEXT("%s"), *ConvertedText);
                break;
        default:
            UE_LOG(Slua, Log, TEXT("%s"), *ConvertedText);
        }
    }
#endif
}

这样的话,断言报错的编译检查就通过了!!

2.关于找不到arm64架构的报错

自己手动编译一个arm64架构的liblua.a库的步骤如下:

第一步

你可以先忽略第一步,如果后续编译失败,再按第一步的操作来做。

编译失败的情况如图:
在这里插入图片描述

如果编译失败,这通常是因为CMake未正确配置或使用系统默认的编译器路径不正确。
CMake的编译需要有C和C++编译器,就要自己指定他们的路径。这两个编译器在我本机中的这个位置 /usr/bin
在这里插入图片描述

在SLua插件目录内,找到CMakeLists.txt这个文件
在这里插入图片描述
在CMakeLists.txt 中显式设置编译器路径:
set(CMAKE_C_COMPILER “/usr/bin/clang”)
set(CMAKE_CXX_COMPILER “/usr/bin/clang++”)
在这里插入图片描述

第二步

在SLua插件目录内,找到make_osx.sh这个文件
在这里插入图片描述
我们要执行它进行编译,先打开cmd,然后cd到它的目录下执行,就像这样:

cd /Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal

然后把make_osx.sh拖动到cmd窗口内,或者你直接输入它的全路径也行,就像这样:

/Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/make_osx.sh

在这里插入图片描述
按回车执行。如果很不巧,遇到了 zsh: permission denied:
在这里插入图片描述
别慌,那是因为没有执行权限,我们通过chmod u+x 的命令给它加执行权限。

chmod u+x /Users/haoxiangliang/Desktop/CodeDraft/UE5/SGEngine-Unreal/UnrealProject/Plugins/Slua/slua_unreal/make_osx.sh  

就像这样:
在这里插入图片描述
然后继续重新执行一下make_osx.sh:
在这里插入图片描述
可以看到,执行成功了。并且看到liblua.a这个库文件有被更新到,说明已经生成了arm64架构的liblua.a
在这里插入图片描述
最后,我们确认一下在slua_unreal.Build.cs中是否有引用到这个liblua.a库 (一般这个不用动)
在这里插入图片描述
至此,再重新编译一下项目,发现可以构建成功了,终于可以启动UE项目了。
在这里插入图片描述

参考:

最后,我也参考了很多文章和网址,在这里也给大家列一下,方便大家对后续问题有更全面的了解。

1.SLua的仓库
2.SLua问题论坛
3.Mac M1下Clion编译错误:Undefined symbols for architecture x86_64和ld: symbol(s) not found for architecture
4.UE官网论坛 关于inker-error-for-arm64报错的问题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值