1

我正在尝试从一本关于现代 OpenGL 的书入手。在书中,我需要链接一些库(即freeglut glew32 vermilion32)。我已经下载了 glew 的源代码并生成了 lib。链接我生成的库没有问题,但似乎作者使用pragma comment它会导致一些链接错误。

LINK : fatal error LNK1104: cannot open file 'glew_static_vs2010.lib'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.EXE"' : return code '0x2'

在代码中使用的头文件之一(即vgl.h)中,有这些行

#ifndef __VGL_H__
#define __VGL_H__

// #define USE_GL3W

#ifdef USE_GL3W

#include <GL3/gl3.h>
#include <GL3/gl3w.h>

#else

#define GLEW_STATIC

#include <GL/glew.h>

#ifdef _MSC_VER
#  ifdef _DEBUG
#    if (_MSC_VER >= 1600)
#      pragma comment (lib, "glew_static_vs2010_d.lib")
#    else
#      pragma comment (lib, "glew_static_d.lib")
#    endif
#  else
#    if (_MSC_VER >= 1600)
#      pragma comment (lib, "glew_static_vs2010.lib")
#    else
#      pragma comment (lib, "glew_static.lib")
#    endif
#  endif
#endif

#endif

#define FREEGLUT_STATIC

#include <GL/freeglut.h>

#ifdef _MSC_VER
#  ifdef _DEBUG
#    if (_MSC_VER >= 1600)
#      pragma comment (lib, "freeglut_static_vs2010_d.lib")
#    else
#      pragma comment (lib, "freeglut_static_d.lib")
#    endif
#  else
#    if (_MSC_VER >= 1600)
#      pragma comment (lib, "freeglut_static_vs2010.lib")
#    else
#      pragma comment (lib, "freeglut_static.lib")
#    endif
#  endif
#endif

#define BUFFER_OFFSET(x)  ((const void*) (x))

#endif /* __VGL_H__ */

我不知道作者为什么要遵循这种方法。我该如何克服这个问题?这是我的 Makefile

CC = cl
CFLAGS = /EHsc /c
INCLUDES = \
    /I D:\CPP_Projects\CommandPrompt\ModernOpenGL\Books\Opengl_Programming_Guide_8th\oglpg_8th_edition\include

LIBS = \
    /LIBPATH:D:\CPP_Projects\CommandPrompt\ModernOpenGL\Books\Opengl_Programming_Guide_8th\oglpg_8th_edition\lib \
    freeglut_staticd.lib glew32sd.lib vermilion32_d.lib

all: project    

project: triangles.obj LoadShaders.obj 
    $(CC) /EHsc /Fetest.exe triangles.obj LoadShaders.obj \
          /link  $(LIBS) 

triangles.obj: triangles.cpp
    $(CC) $(CFLAGS) triangles.cpp $(INCLUDES)

LoadShaders.obj: LoadShaders.cpp
    $(CC) $(CFLAGS) LoadShaders.cpp $(INCLUDES)

clean:
    del *.exe *.obj
4

1 回答 1

0

Microsoft 编译器允许使用#pragma comment (lib, "libraryname.lib")来指定链接器应该使用的库,而不是在命令行上将它们传递给链接器。由于您构建了自己的库,也许您应该注释掉这些整个块以便自动链接vgl.h(甚至删除它们):

#ifndef __VGL_H__
#define __VGL_H__

  // #define USE_GL3W

#ifdef USE_GL3W

#include <GL3/gl3.h>
#include <GL3/gl3w.h>

#else

#define GLEW_STATIC

#include <GL/glew.h>

// #ifdef _MSC_VER
// #  ifdef _DEBUG
// #    if (_MSC_VER >= 1600)
// #      pragma comment (lib, "glew_static_vs2010_d.lib")
// #    else
// #      pragma comment (lib, "glew_static_d.lib")
// #    endif
// #  else
// #    if (_MSC_VER >= 1600)
// #      pragma comment (lib, "glew_static_vs2010.lib")
// #    else
// #      pragma comment (lib, "glew_static.lib")
// #    endif
// #  endif
// #endif

#endif

#define FREEGLUT_STATIC

#include <GL/freeglut.h>

// #ifdef _MSC_VER
// #  ifdef _DEBUG
// #    if (_MSC_VER >= 1600)
// #      pragma comment (lib, "freeglut_static_vs2010_d.lib")
// #    else
// #      pragma comment (lib, "freeglut_static_d.lib")
// #    endif
// #  else
// #    if (_MSC_VER >= 1600)
// #      pragma comment (lib, "freeglut_static_vs2010.lib")
// #    else
// #      pragma comment (lib, "freeglut_static.lib")
// #    endif
// #  endif
// #endif

#define BUFFER_OFFSET(x)  ((const void*) (x))

#endif /* __VGL_H__ */
于 2017-05-16T17:52:37.670 回答