Visual Studio 中静态链接 OpenSceneGraph 库的未解决外部问题

Unresolved externals on static linking OpenSceneGraph libraries in Visual Studio

我在我的应用程序中使用 OpenSceneGraph 库,我想 link 它们是静态的,所以我不必使用二进制文件携带 DLL。我已经下载了 OpenSceneGraph 3.4.0 源代码并通过 cmake 生成了 Visual Studio 项目。我确实在 cmake GUI 中禁用了 DYNAMIC_OPENSCENEGRAPHDYNAMIC_OPENTHREADS。之后,我成功编译了 OSG 并拥有了静态库 (.lib)。在我的应用程序中,我在 project properties -> VC++ Directories -> Include DirectoriesLibrary Directories 中添加了包含目录和库目录(顺便说一下,我使用的是 Visual Studio 2013)。我还在 Linker -> General -> Additional Library Directories 中添加了带有 OSG .lib 的目录,并在 Linker -> Input -> Additional Dependencies 中键入了所有必需的库:

ot20-OpenThreads.lib
osg130-osg.lib
osg130-osgUtil.lib
osg130-osgGA.lib
osg130-osgDB.lib
osg130-osgViewer.lib
osg130-osgText.lib
opengl32.lib
osgdb_3ds.lib
osgdb_freetype.lib
osgdb_png.lib

我仍然收到 OSG 符号的未解决的外部错误。我也尝试将 General -> Character Set 设置为 Unicode,但它没有帮助(在 cmake 生成的 OSG 项目中我有多字节字符)。我现在不知道如何解决这个问题,这是我第一次使用静态 linked 库编译应用程序。

非常感谢任何帮助。

P.s。抱歉,没有代码,我无法提供,但我会尽力提供尽可能多的细节。通过动态 linking,我可以毫无问题地构建我的应用程序。

我自己设法解决了这个问题。 我在 Linker -> Input -> Additional Dependencies:

中还缺少两个库
msvcrt.lib
libcmt.lib

而且我还必须在 C/C++ -> Preprocessor -> Preprocessor Definitions 中添加预处理器定义 OSG_LIBRARY_STATIC。最后一件事是在我的 main.cpp 到 link OSG 插件中添加以下几行代码:

#ifdef OSG_LIBRARY_STATIC
    USE_OSGPLUGIN(freetype)
    USE_OSGPLUGIN(png)
    USE_OSGPLUGIN(3ds)
#endif

现在我的应用程序已成功编译并运行:)

P.s。在第一次构建时,我遇到了 PNG 和 FreeType 插件的错误,这是由于 libpng 和 freetype 缺少 .lib-s 造成的。在我的案例中,通过将 libpng16_static.libfreetype250.lib 添加到 Linker -> Input -> Additional Dependencies 并将它们复制到我的库目录中解决了错误(显然其他插件将依赖于其他库)。