- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
前言
所以我最近一直在使用 Code::Blocks 编写 C++ 程序,最近在尝试编译包含 freeglut 的项目时遇到了编译问题。我在 Windows 8 上,我已经根据 code::blocks wiki 正确安装了 freeglut .我还安装了 git bash 以及 mingw64。问题是我无法编译我的教授(使用 freeglut 的项目)使用 code::blocks 或在 gitbash 中使用 g++ 命令编写的源代码。
main.cpp:
/* Copyright (c) Mark J. Kilgard, 1996. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
#include "Graphics.h"
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
setColor(RED);
drawFilledTriangle(0,0,100,100,200,0);
setColor(BLUE);
drawFilledCircle(200,200,150);
glFlush(); /* Single buffered, so needs a flush. */
}
int main(int argc, char **argv)
{
graphicsSetup( argc, argv, &display);
glutMainLoop();
return 0;
}
图形.cpp
#include <iostream>
using namespace std;
#include "Graphics.h"
#include <cmath>
const double PI = acos(-1.0);
const double ANGLE_STEP = PI/180.0;
void keyboard(unsigned char key, int x, int y)
{
if (key == 27)
exit(1);
}
void clearWindow() {
glClear( GL_COLOR_BUFFER_BIT );
}
void setColor(ColorName name) {
switch(name) {
case WHITE: glColor3d(1.0, 1.0, 1.0); break;
case GREY: glColor3d(0.4, 0.4, 0.4); break;
case BLACK: glColor3d(0.0, 0.0, 0.0); break;
case RED: glColor3d(1.0, 0.0, 0.0); break;
case ORANGE: glColor3d(1.0, 0.5, 0.0); break;
case YELLOW: glColor3d(1.0, 1.0, 0.0); break;
case GREEN: glColor3d(0.0, 1.0, 0.0); break;
case FOREST_GREEN: glColor3d(0.0, 0.25, 0.0); break;
case BLUE: glColor3d(0.0, 0.0, 1.0); break;
case CYAN: glColor3d(0.0, 1.0, 1.0); break;
case MIDNIGHT_BLUE: glColor3d(0.0, 0.0, 0.25); break;
case PURPLE: glColor3d(0.5, 0.25, 0.0); break;
case MAGENTA: glColor3d(1.0, 0.0, 1.0); break;
case BROWN: glColor3d(0.36, 0.16, 0.1); break;
default: cerr << "Trying to set invalid color. Color unchanged" << endl;
}
}
void graphicsSetup(int argc, char *argv[], void (*display)()) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
if (! glutGet(GLUT_DISPLAY_MODE_POSSIBLE))
glutInitDisplayMode(GLUT_INDEX);
glutInitWindowPosition(50,50);
glutInitWindowSize(640, 480);
glutCreateWindow("single triangle");
glClearColor(1.0,1.0,1.0,0.0);
glutDisplayFunc(display);
// set "esc" key to end program
glutKeyboardFunc(keyboard);
// set coordinates to "normal"
glLoadIdentity();
glOrtho(0,640,0,480, 1, -1);
}
void drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3) {
glBegin(GL_LINE_STRIP);
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glVertex2i(x3,y3);
glVertex2i(x1,y1);
glEnd();
}
void drawFilledTriangle(int x1, int y1, int x2, int y2, int x3, int y3) {
glBegin(GL_POLYGON);
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glVertex2i(x3,y3);
glVertex2i(x1,y1);
glEnd();
}
void drawLine(int x1, int y1, int x2, int y2) {
glBegin(GL_LINE_STRIP);
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glEnd();
}
void drawBox(int x1, int y1, int x2, int y2) {
glBegin(GL_LINE_STRIP);
glVertex2i(x1,y1);
glVertex2i(x2,y1);
glVertex2i(x2,y2);
glVertex2i(x1,y2);
glVertex2i(x1,y1);
glEnd();
}
void drawFilledBox(int x1, int y1, int x2, int y2) {
glBegin(GL_POLYGON);
glVertex2i(x1,y1);
glVertex2i(x2,y1);
glVertex2i(x2,y2);
glVertex2i(x1,y2);
glVertex2i(x1,y1);
glEnd();
}
void drawCircle(int x, int y, int radius) {
double angle;
int X, Y;
glBegin(GL_LINE_STRIP);
for (angle=0;angle< 2.0*PI + ANGLE_STEP; angle += ANGLE_STEP) {
X = x + int(double(radius) * cos(angle));
Y = y + int(double(radius) * sin(angle));
glVertex2i(X,Y);
}
glEnd();
}
void drawFilledCircle(int x, int y, int radius) {
double angle;
int X0, Y0, X1, Y1;
glBegin(GL_TRIANGLES);
X1 = x + radius;
Y1 = y;
for (angle=0;angle< 2.0*PI + ANGLE_STEP; angle += ANGLE_STEP) {
X0 = X1;
Y0 = Y1;
X1 = x + int(double(radius) * cos(angle));
Y1 = y + int(double(radius) * sin(angle));
glVertex2i(x,y);
glVertex2i(X0,Y0);
glVertex2i(X1,Y1);
}
glEnd();
}
Graphics.h
#include <GL/glut.h>
// set the pre-defined colors
enum ColorName {
WHITE,
GREY,
BLACK,
RED,
ORANGE,
YELLOW,
GREEN,
FOREST_GREEN,
BLUE,
MIDNIGHT_BLUE,
CYAN,
PURPLE,
MAGENTA,
BROWN,
NUM_COLORS
};
void clearWindow();
void setColor(ColorName name);
void graphicsSetup(int argc, char *argv[], void (*display)());
// graphic object primatives
void drawTriangle(int x1, int y1,int x2,int y2,int x3,int y3);
void drawLine(int x1, int y1, int x2, int y2);
void drawBox(int x1, int y1, int x2, int y2); // x-y coords of upper-right and lower-left corners
void drawCircle(int x, int y, int radius);
// filled graphics primatives
void drawFilledTriangle(int x1, int y1,int x2,int y2,int x3,int y3);
void drawFilledBox(int x1, int y1, int x2, int y2);
void drawFilledCircle(int x, int y, int radius);
生成文件
TARGET = test.exe
CXX = c:\usr\local\mingw32\bin\g++.exe
FILES = main.cpp Graphics.cpp
OBJS = $(FILES:.cpp=.o)
GINCS = -I/usr/local/include/GL
GLIBS = -L/usr/local/lib -lfreeglut -lglu32 -lopengl32 -Wl,--subsystem,windows
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(GLIBS)
%.o: %.cpp
$(CXX) -c $< -o $@ $(GINCS)
clean:
del $(TARGET) $(OBJS)
在 GIT 中编译
我 cd
进入包含 main.cpp 的目录;图形.cpp;图形.h;生成文件
。
然后我运行 make
并获得以下结果,即使我已将所有 freeglut lib、include 和 bin 内容文件添加到 C:\usr\local\mingw32 下的正确目录中(inlcude\,lib\,bin) 和 GL\glut.h 肯定在那里...
$ make
c:\usr\local\mingw32\bin\g++.exe -c main.cpp -o main.o -I/usr/local/include/GL
In file included from main.cpp:7:0:
Graphics.h:1:21: fatal error: GL/glut.h: No such file or directory
compilation terminated.
makefile:16: recipe for target 'main.o' failed
make: *** [main.o] Error 1
在代码:: block 中编译
main.cpp ;图形.h;代码:: block 中的 Graphics.cpp
。C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `_imp____glutInitWithExit@12'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `_imp____glutCreateWindowWithExit@8'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `_imp____glutCreateMenuWithExit@8'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `glClear@4'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `setColor(ColorName)'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `drawFilledTriangle(int, int, int, int, int, int)'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `setColor(ColorName)'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `drawFilledCircle(int, int, int)'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `glFlush@0'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `graphicsSetup(int, char**, void (*)())'
C:\Users\Admin\Desktop\C++Projects\cosc1337.code\GraphicsLib\examples\ex4\main.o:main.cpp|| undefined reference to `_imp__glutMainLoop@0'
=== Build failed: 11 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===
构建并运行
时,我得到与以前相同的错误,但 Graphics.o 已创建。总结:
在我使用 code::blocks 创建目标文件后,我就可以进入 gitbash 并运行 makefile 来链接它们,它确实创建了一个我可以运行并查看的工作 test.exe我的位置在哪里,但我感到困惑和沮丧,因为我不能只使用 code::blocks 或只使用 git,因为这样做会使对代码的调整花费不合理的时间来获得满意的结果,并且肯定会在以后引起问题
编辑
所有其他 Programs我已经编写,以及“hello world”编译,在 code::blocks 和 gitbash 上没有问题。
最佳答案
使用 Makefile
构建项目包括两个步骤:
可以只使用来自纯 cmd
的 MinGW 来完成安慰。唯一的要求是设置 PATH
指向 MinGW 二进制文件的变量。它只能在该控制台本地完成,例如:
PATH=c:\MinGW\mingw-w64\i686-5.1.0-posix-dwarf-rt_v4-rev0\mingw32\bin;%PATH%
假设二进制 freeglut 3.0.0 MinGW Package被提取到文件夹 c:\freeglut
.
::compilation
g++ -c main.cpp -o main.o -I"c:\freeglut\include"
g++ -c Graphics.cpp -o Graphics.o -I"c:\freeglut\include"
::linkage
g++ Graphics.o main.o -o test -L"c:\freeglut\lib" -lfreeglut -lglu32 -lopengl32 -Wl,--subsystem,windows
编译期间main.o
和 Graphics.o
生成目标文件。
在您的情况下,错误出在这一步。它与标题路径有关。检查你的 gitbash
路径 /usr/local/include/
列出它确实存在 ls /usr/local/include/
.如果存在,请注意在您的源文件中 header 包含为 GL/glut.h
还有GL
目录存在于 GINCS
中.如果 header 路径为/usr/local/include/GL/glut.h
,则报错.所以,删除 GL
来自 GINCS
.
链接步骤产生目标test.exe
二进制。
可以调整 Code::Blocks IDE 使 GLUT 项目模板与 freeglue
一起工作如 Using FreeGlut with Code::Blocks 中所述.
刚好需要替换Glut32
通过 freeglut
在向导脚本中 glut\wizard.script
并在项目模板中 glut.cbp
.
现在可以使用 GLUT project
创建一个新项目预设。它只会问你 glut
小路。然后 Code::Blocks 自动创建配置了所需编译器选项( header 路径)和链接器选项(路径和库)的项目。它还给出了 main.cpp
包含可以按原样编译的基本示例的文件。
看起来您创建的不是 GLUT project
但只是一个普通的空应用程序项目。要使其工作,您需要配置 Project build options
:
Search directories
: 在 Compiler
中添加路径标签 ( c:\freeglut\include
) 和 Linker
标签 ( c:\freeglut\lib
);Linker settings
: 添加所需库的名称,不带 l
前缀(freeglut
、glu32
、opengl32
)。关于c++ - 使用 freeglut 编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33193516/
我今天刚开始使用 OpenGL 并关注 a tutorial用于在 Visual Studio 2010 中设置 OpenGL 项目。但是当我运行代码时,我看到一个窗口打开得非常快,闪烁然后消失。这正
问题是当我按下键盘摇杆上的“shift”其他键时。这是我正在使用的代码(原始代码归功于 Nghia Ho) #include #include #include #include "Camera
我正在尝试从 main 方法上的函数传递对象引用。我认为问题出在这里。 在java中我会做这样的事情: Object obj; theFunction(obj); 方法定义如下: public voi
我已经开始练习了OpenGL与 Glew和 Freeglut . 我对我的应用程序有疑问,想知道是否有人遇到同样的问题(如果是的话)? 当我最初执行我的应用程序时,使用的内存约为 22,000 KB。
我是这个网站的新手,对编程也比较陌生。 我一直在使用 Visual Studio 2010 进行一些 C++ 编程,我想进入 OpenGL,所以我购买了 OpenGL Superbible 以开始使用
我参与了一个为其客户使用 freeglut(基于长期停用的过剩)的开发项目。 客户端最终将允许与大型 3d 环境进行完全交互。我应该让 freeglut 继续开发(甚至可能吗),或者我应该建议他们使用
我的 Opengl/freeglut/c++ 2D 编辑器小项目有问题。 编辑器允许您绘制四边形或三角形(对象)。您可以通过将对象的一角拖动到任何您想要的位置来调整对象的大小。如果对象处于事件状态,您
我有一个项目,我正在使用 glut,但是为了能够使用,我去了 free glut glutBitmapCharacter 但是,当我这样做时,我用来绘制网格的方法不再有效 //This creates
我用 freeglut 创建一个 GL 上下文,如下所示: glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_STENCIL); 然后像这样用 ca
我一直想使用 freeglut 试验平台物理学,但在我允许自己开始之前,我有一个老问题需要解决。 你看,我想编写一个 reshape 处理程序,它不仅可以保持比例并消除 View 的任何失真,而且还允
我有 Windows 代码,它为多台显示器创建可用分辨率列表。 现在我必须将它移植到 Linux 上,所以我想使用“FREEGLUT”,这样我就可以使用相同的代码获取 Linux 和 Windows
我正在阅读 OpenGl superbible,在第一个三角形程序上它不会运行。该程序编译得很好,但是当我运行它时,它给了我错误消息 freeglut.dll is missing from your
在尝试使用 Freeglut 创建 OpenGL 4.1 上下文时,我发现了一些不一致之处: 我使用的是带有最新驱动程序的 AMD 显卡。在 AMD 网站上它说 OpenGL 4.2 support
我正在尝试在 openGL 中绘制彩虹色图例。这是我到目前为止所得到的: glBegin(GL_QUADS); for (int i = 0; i != legendElements; ++i) {
我正在使用 MSVC++ 和 freeglut 来使用 openGL。现在,我有一个名为 Camera 的类,它非常简单,但它还具有重新调整窗口形状的功能。 我的问题是:如何将 glutReshape
我真的很难用 FreeGLUT 关闭我的控制台应用程序。 我想知道最好的方法是采取每一个可能的关闭,因为我不希望任何内存泄漏(我非常害怕那些)。 所以我已经尝试了以下方法,这给了我这样的异常: Fir
我有免费的 glut 项目,其中包含计算 voronoy 网格、初始化 freeglut 然后绘制网格的代码。 pre-calculations ... printf("Elapsed %lf sec
前言 所以我最近一直在使用 Code::Blocks 编写 C++ 程序,最近在尝试编译包含 freeglut 的项目时遇到了编译问题。我在 Windows 8 上,我已经根据 code::block
我编写了一个 event 类模板,旨在提供 C# 风格的事件:事件实例存储为类的公共(public)成员,以向所有者类提供不同的事件。例如: template class event{ .... };
我在网上找到的教程的帮助下学习 OpenGL。他们中的许多人使用 GLUT 库,尽管通常建议使用 freeglut。用 freeglut 头文件替换 GLUT 头文件将如何影响编译?这种简单的替换可能
我是一名优秀的程序员,十分优秀!