基础问题
unresolved external symbol的出现是因为项目代码里使用到了其他模块,然而xx.build.cs
文件中并没有添加对这些其他模块的依赖。
例如:
AI相关
,需要添加AIModule
PublicDependencyModuleNames.AddRange(new string[] {"AIModule"}
UMG相关
,需要添加UMG
PublicDependencyModuleNames.AddRange(new string[] {"UMG"}
至于PublicDependencyModuleNames
和PrivateDependencyModuleNames
的区别在于是.h
还是.cpp
中使用到其他模块的代码,一般用PublicDependencyModuleNames就行。
高阶问题
可能你还会碰到即使在*.build.cs
中添加了其他模块的名字,依旧报错的情况。
比如引擎中的UPendingNetGame
这个类,你要是想要在自己代码中使用,需要包含Engine
这个模块名,不过一般*.build.cs
文件中都默认添加了,但是依旧存在unresolved external symbol
的问题。
这是因为UE4的UCLASS
必须包含模块宏
,才能被其他模块使用,此处将
class UPendingNetGame的定义中添加模块宏ENGINE_API
(模块名大写_API),因为属于Engine模块,至于到底属于哪个模块可以看相应代码对应的*.build.cs
文件中的定义public class 模块名: ModuleRules
改成class
ENGINE_API UPendingNetGame
后发现还会有编译错误,那是因为该文件中有个SetEncryptionKey
函数被单独开启了模块宏,只需要去掉该函数前面的ENGINE_API即可。
总结
外部链接的问题根源在于没有 手动包含
或者 没有开放给外部使用
针对具体模块解决依赖问题即可