为 Mac 构建时,.o 文件中有数十个“未定义的架构符号...”

问题描述

我是一名游戏程序员,因为我正在尝试为 macOS 编译古老的虚幻引擎 3。该游戏适用于 Windows。然而,Mac 构建无法构建,因为 .o 文件显然包含数十个未定义的符号。

构建的工作方式是这样的:我从 Windows 机器上的 Visual Studio 中的一个项目开始。在同一网络上的 Mac 上,我运行一个工具来侦听某个端口上的命令。我认为 Mac 上的重要信息是它运行的是 macOS 10.15,带有 Xcode 11 和 Xcode 11 的命令行工具。在 Windows 机器上,我启动 Mac 构建,这会导致一个名为 Unreal Build Tool 的程序进行复制文件到 Mac,然后它会向 Mac 发送一长串命令。我认为命令的重要部分是

clang++ -c -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -mmacosx-version-min=10.9 -O3

并且该命令根据正在编译的文件而略有不同,但对于 .cpp 文件,该命令会添加

-x c++ -fno-rtti -std=c++11

所有文件似乎都成功编译了几分钟,直到我们到达这一点:

Undefined symbols for architecture x86_64:
2>    "_SteamGameServer_GetHSteamUser",referenced from:
2>        SteamInternal_Init_SteamGameServer(ISteamGameServer**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamGameServerStats(ISteamGameServerStats**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamGameServerNetworking(ISteamNetworking**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>    "_SteamInternal_FindOrCreateGameServerInterface",referenced from:
2>        SteamInternal_Init_SteamGameServer(ISteamGameServer**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamGameServerStats(ISteamGameServerStats**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamGameServerNetworking(ISteamNetworking**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamGameServerUtils(ISteamUtils**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>    "_SteamAPI_GetHSteamUser",referenced from:
2>        SteamInternal_Init_SteamApps(ISteamApps**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamInput(ISteamInput**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamUser(ISteamUser**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamFriends(ISteamFriends**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamRemoteStorage(ISteamRemoteStorage**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamUserStats(ISteamUserStats**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        SteamInternal_Init_SteamMatchmakingServers(ISteamMatchmakingServers**) in Unity_VoiceInterfaceSteamworksEtAl.cpp.o
2>        ...

有很多行非常相似。

我尝试使用 nmdwarfdump 仔细查看有问题的 .o 文件,但我不确定我在寻找什么。这是一个 10 兆字节的文件nm 只是告诉我一堆符号未定义。我还尝试在添加了“-v”的情况下运行构建,它为我提供了有关 clang 以及它在何处查找头文件的更多信息,但我不确定这些信息是否有用。

我还尝试了其他 macOS SDK 和最低 macOS 版本的各种组合。我也尝试过“-stdlib=libc++”和“-std=c++98”,但没有任何进一步的帮助。

因为游戏在windows下编译正常,所以我觉得源代码应该没问题,只是Mac配置有问题。知道我应该查看什么以确保在构建 .o 文件时定义各种符号吗?

编辑:根据评论,似乎是链接器而不是 clang 会导致此错误。我正在查看构建工具运行的内容,我认为这是链接器命令。

clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -mmacosx-version-min=10.9 -dead_strip -framework AudioToolBox -framework AudioUnit -framework Cocoa -framework CoreAudio -framework OpenGL -framework IOKit -framework Security -L ../External/physx/SDKs/lib/osxstatic/ -L ../External/libogg-1.2.2/macosx/ -L ../External/libvorbis-1.3.2/macosx/ -l ogg

实际上,有很多 -L 和 -l 条目,大概有 20-30 个。该工具还设置了包含路径和“附加阴影文件”。有一个 .dylib 文件似乎相关,但看起来不像是包含在其他影子文件中。我添加了它,但这也没有改变任何东西。我在这里找对了输入需要链接文件的位置吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)