请教VC++和penGL高手:在用VC++6.0运行OpenGL程序初始化失败问题
发布网友
发布时间:2022-06-07 03:10
我来回答
共5个回答
热心网友
时间:2023-10-15 17:32
首先, 我们需要在Visual C++ 中创建一个工程。 假如你不知道怎么做的话, 我想你应该先学习 Visual C++ 而不是 OpenGL。 可供下载的代码是用 Visual C++ 6.0 写成的。 在某些版本的 VC++ 中, 需要把 bool 改为 BOOL, true 改为 TRUE, false 改为 FALSE。 做了上述修改之后, 代码可以在 Visual C++ 4.0和5.0 中编译通过。
在Visual C++ 中当你创建了一个新的 Win32 程序(并非控制台程序) 之后, 你还需要链接 OpenGL 的库文件。 操作步骤是: Project-> Settings, 点击 LINK 标签, 在 “Object/Library Moles” 下面那一行的开始处(在kernel32.lib之前) 增添 OpenGL32.lib, GLu32.lib 和 GLaux.lib, 完成之后点击 OK 按钮。 现在你已经准备好来书写一个 OpenGL 视窗程序了。
代码的前4行包含了我们所需库的头文件, 如下:
#include <windows.h> // Header File For Windows
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The GLaux Library
然后我们需要初始化所有要用的变量。 因为这个程序仅仅创建一个空的 OpenGL 窗口, 所以需要初始化的变量并不多。 一些变量的初始化工作是十分重要的, 它们将在以后的每个 OpenGL 程序中被沿用。
下面第一行代码设置一个 Rendering Context (渲染描述表,着色描述表,渲染上下文), 每一个 OpenGL 程序都会连接一个 Rendering Context, Rendering Context 将 OpenGL调用 连接到 Device Context (设备描述表,设备上下文)。OpenGL Rendering Context 在这里被定义为 hRC。 要在窗口中进行绘制我们还需要创建一个 Device Context, 这是第二行代码所做的事情, Windows Device Context 在这里被定义为 hDC。 DC 将窗口连接到 GDI (Graphics Device Interface, 图形设备接口), 而 RC 将 OpenGL 连接到 DC。
第三行代码中的 hWnd 变量用于保存 Windows 分配给我们的窗口句柄, 而第四行用于保存我们的应用程序实例句柄。
HGLRC hRC=NULL; // Permanent Rendering Context
HDC hDC=NULL; // Private GDI Device Context
HWND hWnd=NULL; // Holds Our Window Handle
HINSTANCE hInstance; // Holds The Instance Of The Application
下面第一行代码设置一个用于接收键盘输入的数组。 这是接收键盘输入的多种方法中的其中一种, 比较可靠, 而且支持同时按下多个键。
active 变量用于通知我们程序是否被最小化了。 如果窗口被最小化了, 我们可以做任何事情, 挂起程序或者退出程序。 我比较喜欢挂起程序, 当最小化的时候程序在后台不会保持运行状态。
变量fullscreen 可以反映出我们的程序是否运行于全屏幕模式, 是的话它就为 TRUE; 如果运行于窗口模式, 它就为 FALSE。 创建这个全局变量是十分有用的, 它让每个程序知道其自身是否运行于全屏幕模式。
bool keys[256]; // Array Used For The Keyboard Routine
bool active=TRUE; // Window Active Flag Set To TRUE By Default
bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default
下面我们需要声明窗口回调函数 WndProc()。 原因是 CreateGLWindow() 函数中有对其的引用, 但是 WndProc() 的函数体定义却又在 CreateGLWindow() 的后面。 我们知道在 C 语言中要使用一个函数的话函数必须在之前已经声明了, 所以这里我们要先声明 WndProc()。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
下一段代码的作用是当窗口大小被调整时 (对于窗口模式) 调整 OpenGL 场景的大小。 如果窗口大小并不能被调整 (例如全屏幕模式的时候), 此段代码也至少会在程序首次运行的时候被调用一次, 用来设置透视。 OpenGL 场景会根据它的显示窗口的宽与高来做调整。
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
{
if (height==0) // Prevent A Divide By Zero By
{
height=1; // Making Height Equal One
}
glViewport(0, 0, width, height); // Reset The Current Viewport
下面几行代码用于设置透视图, 用于实现现实世界近大远小的视觉效果。 基于窗口的宽与高, 透视被设置为 45 度视野。 值0.1f 和100.0f 指定了始点和末点, 也就是指定我们可以绘制的透视深度。
glMatrixMode(GL_PROJECTION) 设置当前矩阵为投影矩阵, 所以随后的两行代码都针对投影矩阵进行操作。 投影矩阵负责给我们的场景增加透视。 glLoadIdentity() 的功能是重置当前指定的矩阵为单位矩阵。 在glLoadIdentity() 之后我们为场景设置了透视图。 glMatrixMode(GL_MODELVIEW) 设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。 然后我们重置了模型视图矩阵。你可能不知道为什么要这样做,不过没关系,我会在以后的教程中作解释。 现在你只需要知道,要完成一个漂亮的场景就必须这样做就可以了。
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}
接下来的这段代码中我们将完成对 OpenGL 的所有设置, 比如设置清除屏幕所用的颜色, 打开深度缓存(Depth Buffer), 打开平滑阴影等。 这段程序在 OpenGL 窗口创建完成之前不会被调用。 这段程序具有返回值, 但由于现在我们的初始化工作并不复杂, 所以现在可以不必关心这个返回值。
int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
下面这行代码用于打开平滑阴影。 平滑阴影会在多边形内精细地混合颜色, 和平滑光照。 关于平滑阴影的更多细节会在以后的教程中阐述。
glShadeModel(GL_SMOOTH); // Enables Smooth Shading
热心网友
时间:2023-10-15 17:32
解决外部符号错误:_main,_WinMain@16,__beginthreadex
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
下面介绍解决的方法:
1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows
2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
控制台项目要使用Console子系统, 而不是Windows, 设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:windows改成/subsystem:console
3. 程序入口设置错误, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
4. 线程运行时库设置错误, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
这是因为MFC要使用多线程时库, 需要更改设置:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中,
Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本)
Debug Multithreaded DLL 多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用
参考资料:http://bbs.anqn.com/simple/index.php?t1437.shtml
热心网友
时间:2023-10-15 17:32
1.增加新用户ftp,设置其主目录对任何用户都无写权限;
2.新建立一个组anonymou,它只能被匿名ftp使用;
3.在ftp用户的主目录下创建一个bin目录,它属于root用户,而且对任何用户都不能写;
4.在ftp用户主目录下创建一个etc目录,它属于root用户,而且对任何用户都不能写;
5.在ftp用户主目录下创建一个public目录,它属于ftp用户,而且对任何用户都能写。如果由 于安全等原因,您不允许其他用户在您的计算机上具有存储能力,那么您可以将其权限设置成555;
6.将ls程序放到已创建的bin目录下,并将其修改成111方式,即对任何用户只能执行;
7.在已创建的etc目录下,创建passwd和group两个文件,并将它们设置成444方式(只读)。
回答者:vjk8826 - 助理 二级 12-20 16:39
1、首先请确认OpenGL应用环境的框架和应用代码是否写好了!例如检查CView::OnCreate中的代码,OnDraw中的最后是否使用了 glFinish,SwapBuffers等等。最好的办法是使用示例代码写给简单测试程序。
2、假如代码确认无误,请检查系统使用的显卡驱动,安装显卡厂商提供驱动程序。有部分显卡Windows自带的驱动程序会导致OpenGL初始化异常。
1.增加新用户ftp,设置其主目录对任何用户都无写权限;
2.新建立一个组anonymou,它只能被匿名ftp使用;
3.在ftp用户的主目录下创建一个bin目录,它属于root用户,而且对任何用户都不能写;
4.在ftp用户主目录下创建一个etc目录,它属于root用户,而且对任何用户都不能写;
5.在ftp用户主目录下创建一个public目录,它属于ftp用户,而且对任何用户都能写。如果由 于安全等原因,您不允许其他用户在您的计算机上具有存储能力,那么您可以将其权限设置成555;
6.将ls程序放到已创建的bin目录下,并将其修改成111方式,即对任何用户只能执行;
7.在已创建的etc目录下,创建passwd和group两个文件,并将它们设置成444方式(只读)。 或 1、首先请确认OpenGL应用环境的框架和应用代码是否写好了!例如检查CView::OnCreate中的代码,OnDraw中的最后是否使用了 glFinish,SwapBuffers等等。最好的办法是使用示例代码写给简单测试程序。
2、假如代码确认无误,请检查系统使用的显卡驱动,安装显卡厂商提供驱动程序。有部分显卡Windows自带的驱动程序会导致OpenGL初始化异常。
解决外部符号错误:_main,_WinMain@16,__beginthreadex
在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
下面介绍解决的方法:
1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows
2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
控制台项目要使用Console子系统, 而不是Windows, 设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:windows改成/subsystem:console
3. 程序入口设置错误, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
4. 线程运行时库设置错误, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
这是因为MFC要使用多线程时库, 需要更改设置:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中,
Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本)
Debug Multithreaded DLL 多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用
参考资料:http://bbs.anqn.com/simple/index.php?t1437.shtml
首先, 我们需要在Visual C++ 中创建一个工程。 假如你不知道怎么做的话, 我想你应该先学习 Visual C++ 而不是 OpenGL。 可供下载的代码是用 Visual C++ 6.0 写成的。 在某些版本的 VC++ 中, 需要把 bool 改为 BOOL, true 改为 TRUE, false 改为 FALSE。 做了上述修改之后, 代码可以在 Visual C++ 4.0和5.0 中编译通过。
在Visual C++ 中当你创建了一个新的 Win32 程序(并非控制台程序) 之后, 你还需要链接 OpenGL 的库文件。 操作步骤是: Project-> Settings, 点击 LINK 标签, 在 “Object/Library Moles” 下面那一行的开始处(在kernel32.lib之前) 增添 OpenGL32.lib, GLu32.lib 和 GLaux.lib, 完成之后点击 OK 按钮。 现在你已经准备好来书写一个 OpenGL 视窗程序了。
代码的前4行包含了我们所需库的头文件, 如下:
#include <windows.h> // Header File For Windows
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The GLaux Library
然后我们需要初始化所有要用的变量。 因为这个程序仅仅创建一个空的 OpenGL 窗口, 所以需要初始化的变量并不多。 一些变量的初始化工作是十分重要的, 它们将在以后的每个 OpenGL 程序中被沿用。
下面第一行代码设置一个 Rendering Context (渲染描述表,着色描述表,渲染上下文), 每一个 OpenGL 程序都会连接一个 Rendering Context, Rendering Context 将 OpenGL调用 连接到 Device Context (设备描述表,设备上下文)。OpenGL Rendering Context 在这里被定义为 hRC。 要在窗口中进行绘制我们还需要创建一个 Device Context, 这是第二行代码所做的事情, Windows Device Context 在这里被定义为 hDC。 DC 将窗口连接到 GDI (Graphics Device Interface, 图形设备接口), 而 RC 将 OpenGL 连接到 DC。
第三行代码中的 hWnd 变量用于保存 Windows 分配给我们的窗口句柄, 而第四行用于保存我们的应用程序实例句柄。
HGLRC hRC=NULL; // Permanent Rendering Context
HDC hDC=NULL; // Private GDI Device Context
HWND hWnd=NULL; // Holds Our Window Handle
HINSTANCE hInstance; // Holds The Instance Of The Application
下面第一行代码设置一个用于接收键盘输入的数组。 这是接收键盘输入的多种方法中的其中一种, 比较可靠, 而且支持同时按下多个键。
active 变量用于通知我们程序是否被最小化了。 如果窗口被最小化了, 我们可以做任何事情, 挂起程序或者退出程序。 我比较喜欢挂起程序, 当最小化的时候程序在后台不会保持运行状态。
变量fullscreen 可以反映出我们的程序是否运行于全屏幕模式, 是的话它就为 TRUE; 如果运行于窗口模式, 它就为 FALSE。 创建这个全局变量是十分有用的, 它让每个程序知道其自身是否运行于全屏幕模式。
bool keys[256]; // Array Used For The Keyboard Routine
bool active=TRUE; // Window Active Flag Set To TRUE By Default
bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default
下面我们需要声明窗口回调函数 WndProc()。 原因是 CreateGLWindow() 函数中有对其的引用, 但是 WndProc() 的函数体定义却又在 CreateGLWindow() 的后面。 我们知道在 C 语言中要使用一个函数的话函数必须在之前已经声明了, 所以这里我们要先声明 WndProc()。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
下一段代码的作用是当窗口大小被调整时 (对于窗口模式) 调整 OpenGL 场景的大小。 如果窗口大小并不能被调整 (例如全屏幕模式的时候), 此段代码也至少会在程序首次运行的时候被调用一次, 用来设置透视。 OpenGL 场景会根据它的显示窗口的宽与高来做调整。
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
{
if (height==0) // Prevent A Divide By Zero By
{
height=1; // Making Height Equal One
}
glViewport(0, 0, width, height); // Reset The Current Viewport
下面几行代码用于设置透视图, 用于实现现实世界近大远小的视觉效果。 基于窗口的宽与高, 透视被设置为 45 度视野。 值0.1f 和100.0f 指定了始点和末点, 也就是指定我们可以绘制的透视深度。
glMatrixMode(GL_PROJECTION) 设置当前矩阵为投影矩阵, 所以随后的两行代码都针对投影矩阵进行操作。 投影矩阵负责给我们的场景增加透视。 glLoadIdentity() 的功能是重置当前指定的矩阵为单位矩阵。 在glLoadIdentity() 之后我们为场景设置了透视图。 glMatrixMode(GL_MODELVIEW) 设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。 然后我们重置了模型视图矩阵。你可能不知道为什么要这样做,不过没关系,我会在以后的教程中作解释。 现在你只需要知道,要完成一个漂亮的场景就必须这样做就可以了。
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity(); // Reset The Modelview Matrix
}
接下来的这段代码中我们将完成对 OpenGL 的所有设置, 比如设置清除屏幕所用的颜色, 打开深度缓存(Depth Buffer), 打开平滑阴影等。 这段程序在 OpenGL 窗口创建完成之前不会被调用。 这段程序具有返回值, 但由于现在我们的初始化工作并不复杂, 所以现在可以不必关心这个返回值。
int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
下面这行代码用于打开平滑阴影。 平滑阴影会在多边形内精细地混合颜色, 和平滑光照。 关于平滑阴影的更多细节会在以后的教程中阐述。
glShadeModel(GL_SMOOTH); // Enables Smooth Shading
热心网友
时间:2023-10-15 17:33
1、首先请确认OpenGL应用环境的框架和应用代码是否写好了!例如检查CView::OnCreate中的代码,OnDraw中的最后是否使用了 glFinish,SwapBuffers等等。最好的办法是使用示例代码写给简单测试程序。
2、假如代码确认无误,请检查系统使用的显卡驱动,安装显卡厂商提供驱动程序。有部分显卡Windows自带的驱动程序会导致OpenGL初始化异常。
热心网友
时间:2023-10-15 17:34
1.增加新用户ftp,设置其主目录对任何用户都无写权限;
2.新建立一个组anonymou,它只能被匿名ftp使用;
3.在ftp用户的主目录下创建一个bin目录,它属于root用户,而且对任何用户都不能写;
4.在ftp用户主目录下创建一个etc目录,它属于root用户,而且对任何用户都不能写;
5.在ftp用户主目录下创建一个public目录,它属于ftp用户,而且对任何用户都能写。如果由 于安全等原因,您不允许其他用户在您的计算机上具有存储能力,那么您可以将其权限设置成555;
6.将ls程序放到已创建的bin目录下,并将其修改成111方式,即对任何用户只能执行;
7.在已创建的etc目录下,创建passwd和group两个文件,并将它们设置成444方式(只读)。 或 1、首先请确认OpenGL应用环境的框架和应用代码是否写好了!例如检查CView::OnCreate中的代码,OnDraw中的最后是否使用了 glFinish,SwapBuffers等等。最好的办法是使用示例代码写给简单测试程序。
2、假如代码确认无误,请检查系统使用的显卡驱动,安装显卡厂商提供驱动程序。有部分显卡Windows自带的驱动程序会导致OpenGL初始化异常。