问题解决——OpenGL超级宝典 第四章 4.5.2 关于freeglut.lib问题的解决过程

看《OpenGL超级宝典(第四版)》的4.5.2节时遇到了一系列问题,经过不懈努力终于解决,现将过程记录在下,以便查找追思。


在第4.5.2节之前,自己写的的代码都没有使用作者的gltools.h文件,而是直接使用的glut.h文件,且从未出现过问题。

看到4.5.2节时,本来想先看看运行效果,于是复制运行了作者的代码,结果遇到了问题:

11>LINK : fatal error LNK1104: 无法打开文件“freeglut.lib”

解决方法:

(1)下载freeglut-2.8.1.tar.gz压缩包并解压。

(2)将freeglut-2.8.1\freeglut-2.8.1\include\GL文件夹下的freeglut.h、freeglut_ext.h、freeglut_std.h、glut.h文件复制到C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\gl文件夹下。(初次配置OpenGL环境后,C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\gl文件夹下会有一个glut.h文件,将它改个名字屏蔽掉,防止覆盖,例如“glut.h-”)

(3)将freeglut-2.8.1\freeglut-2.8.1\lib\x86文件夹下的freeglut.dll文件复制到C:\Windows\System32文件夹下。

(4)将freeglut-2.8.1\freeglut-2.8.1\lib\x86文件夹下的freeglut.lib、freeglut_static.lib文件复制到C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib文件夹下。

按F7生成后出现另外的问题:

21>MainOfTempCode.obj : error LNK2001: 无法解析的外部符号 "void __cdecl m3dRotationMatrix44(float * const,float,float,float,float)" (?m3dRotationMatrix44@@YAXQAMMMMM@Z)

1>D:\WLSCode\TempCode\Debug\TempCode.exe : fatal error LNK1120: 1 个无法解析的外部命令

解决方法:

添加shared文件夹下的math3d.cpp到工程中。

再次F7生成后又出现一个问题:

31>Link:
1>  freeglut_static.lib(freeglut_display.obj) : 找到 MSIL .netmodule 或使用 /GL 编译的模块;正在使用 /LTCG 重新启动链接;将 /LTCG 添加到链接命令行以改进链接器性能
1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
1>libcmt.lib(crt0dat.obj) : error LNK2005: __initterm_e 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(crt0dat.obj) : error LNK2005: _exit 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(crt0dat.obj) : error LNK2005: __exit 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(crt0dat.obj) : error LNK2005: __cexit 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(crt0dat.obj) : error LNK2005: __amsg_exit 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(invarg.obj) : error LNK2005: __invoke_watson 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_a 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xi_z 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_a 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>libcmt.lib(crt0init.obj) : error LNK2005: ___xc_z 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>libcmt.lib(crt0.obj) : error LNK2005: _mainCRTStartup 已经在 MSVCRTD.lib(crtexe.obj) 中定义
1>libcmt.lib(errmode.obj) : error LNK2005: ___set_app_type 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(mlock.obj) : error LNK2005: __unlock 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(mlock.obj) : error LNK2005: __lock 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(winxfltr.obj) : error LNK2005: __XcptFilter 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>libcmt.lib(setlocal.obj) : error LNK2005: __configthreadlocale 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义
1>LINK : warning LNK4098: 默认库“MSVCRTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: 默认库“libcmt.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>D:\WLSCode\TempCode\Debug\TempCode.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
1>
1>生成失败。

解决方法:

屏蔽gltools.h文件夹下的“#define FREEGLUT_STATIC”一行。

最后F7生成成功,运行正常。


-----------------------------------------------------------------

至此,本着“看效果”的目的,运行作者代码成功。

(我想,我写的这篇文章应该是最全面详实的了。)

你可能感兴趣的:(疑难问题)