本文主要讲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报错的问题