glew, freeglut库配置及其冲突解决

最近在看MeshGit: Diffing and Merging Meshes for Polygonal Modeling. JD Denning, F Pellacini. ACM Transactions on Graphics (TOG) 32 (4), 35, 2013. 36, 2013.这篇Siggraph文章, 想着跑一下作者的代码看看, CMake那里的问题还好解决, 但在编译时就踩了不少坑, 除了里面居然用and表示&&, or表示||, not表示!这类神奇的Python写法之外, 还在使用glew和freeglut的lib时遇到不少问题, 特此总结一下~

主要参考博客: 配置自己的OpenGL库,glew、freeglut库编译,库冲突解决(附OpenGL Demo程序)

放到自己的问题上来, 主要需要注意的点是在使用第三方库时要保证他们与程序自身所使用的CRT是一致的, 即如果编译程序B时使用了动态版本的CRT而编译A时使用的是静态版本CRT(即A、B使用了不同版本的CRT), 则大概率会出现了符号重定义之类的链接错误(错误代码一般为LINK2001或者2019). 当然如果用动态链接版本的B, 程序A运行时可执行文件搜索路径中必须包含B.dll. 否则报告”丢失xxx.dll”之类的错误. 设置程序到底使用哪个版本的CRT可在VS的”项目属性 >> 配置属性 >> C/C++ >> 代码生成 >> 运行库”中设置, 如下图所示:

其中, MT为是multi-thread的缩写, 大写D代表DLL, 小写d代表debug, 如/MDd下引用动态链接调试版本的库, 并且编译器定义宏_DEBUG, _MT, _DLL(程序中可以用#ifdef指令来动态选择使用的库版本, 如下所示).

#ifdef _DLL // dynamic link
#ifdef _DEBUG
#pragma comment (lib, "glew32d.lib")
#pragma comment (lib, "freeglutd.lib")
#else
#pragma comment (lib, "glew32.lib")
#pragma comment (lib, "freeglut.lib")
#endif
#else // static link
#ifdef _DEBUG
#pragma comment (lib, "glew32sd.lib")
#pragma comment (lib, "freeglut_staticd.lib")
#else
#pragma comment (lib, "glew32s.lib")
#pragma comment (lib, "freeglut_static.lib")
#endif
#define GLEW_STATIC
#define FREEGLUT_STATIC
#endif

在编译meshgit时, 我使用的库及程序的CRT都统一为了/MT(Release下使用)和/MTd(Debug下使用), 因为这两种模式不需要使用Dll. 由此可以看出, 库最好还是尽量下载源码下来自己编译, 这样方便控制其CRT, 如果是使用官方帮你编译好的lib, 当使用的第三方库数目一多, 就很容易出现各种奇奇怪怪的错误, 包括喜闻乐见的”无法解析的外部符号”系列~

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注