Here we'll describe how to create Makefile using Imakefile.
Create the Imakefile for example with following contents
Create the Imakefile for example with following contents
TARGET = program.out OBJS = main.o SRCS = main.cpp CC = g++ CCOPTIONS = -g MESAINCDIR = /usr/include MESALIBDIR = /usr/lib GLLIB = -L$(MESALIBDIR) -lglut -lGLU -lGL XLIB = -L/usr/lib -lXmu -lXi -lXext -lX11 -lm -lpthread INCLUDES = -I$(MESAINCDIR) LOCAL_LIBRARIES = $(GLLIB) $(XLIB) ComplexProgramTarget($(TARGET)) |
Use xmkmf command to create makefile from Imakefile.
$ xmkmf |
xmkmf script actually uses imake command to create Imakefile. Hence following command would also work.
$ imake -DUseInstalled -I/usr/share/X11/config |
xmkmf command does not necessarily require a parameter. It looks for a file named Imakefile inside current dirctory to create makefile.
If imake package is not installed bash will tell you that Command not found. For Fedora Core Systems login as root and type the following command.
If imake package is not installed bash will tell you that Command not found. For Fedora Core Systems login as root and type the following command.
# yum -y install imake |
For Ubuntu the command will be something like this.
$ sudo apt-get install imake |
Now imake or xmkmf command will work.
Now let's test it compiling and running a program. Create your source file main.cpp for example with following contents.
Now let's test it compiling and running a program. Create your source file main.cpp for example with following contents.
/* Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above notice and this permission notice shall be included in all copies * or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /* File for "Basic Shapes" lesson of the OpenGL tutorial on * www.videotutorialsrock.com */ #include <iostream> #include <stdlib.h> //Needed for "exit" function //Include OpenGL header files, so that we can use OpenGL #ifdef __APPLE__ #include <OpenGL/OpenGL.h> #include <GLUT/glut.h> #else #include <GL/glut.h> #endif using namespace std; //Called when a key is pressed void handleKeypress(unsigned char key, //The key that was pressed int x, int y) { //The current mouse coordinates switch (key) { case 27: //Escape key exit(0); //Exit the program } } //Initializes 3D rendering void initRendering() { //Makes 3D drawing work when something is in front of something else glEnable(GL_DEPTH_TEST); } //Called when the window is resized void handleResize(int w, int h) { //Tell OpenGL how to convert from coordinates to pixel values glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); //Switch to setting the camera perspective //Set the camera perspective glLoadIdentity(); //Reset the camera gluPerspective(45.0, //The camera angle (double)w / (double)h, //The width-to-height ratio 1.0, //The near z clipping coordinate 200.0); //The far z clipping coordinate } //Draws the 3D scene void drawScene() { //Clear information from last draw glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective glLoadIdentity(); //Reset the drawing perspective glBegin(GL_QUADS); //Begin quadrilateral coordinates //Trapezoid glVertex3f(-0.7f, -1.5f, -5.0f); glVertex3f(0.7f, -1.5f, -5.0f); glVertex3f(0.4f, -0.5f, -5.0f); glVertex3f(-0.4f, -0.5f, -5.0f); glEnd(); //End quadrilateral coordinates glBegin(GL_TRIANGLES); //Begin triangle coordinates //Pentagon glVertex3f(0.5f, 0.5f, -5.0f); glVertex3f(1.5f, 0.5f, -5.0f); glVertex3f(0.5f, 1.0f, -5.0f); glVertex3f(0.5f, 1.0f, -5.0f); glVertex3f(1.5f, 0.5f, -5.0f); glVertex3f(1.5f, 1.0f, -5.0f); glVertex3f(0.5f, 1.0f, -5.0f); glVertex3f(1.5f, 1.0f, -5.0f); glVertex3f(1.0f, 1.5f, -5.0f); //Triangle glVertex3f(-0.5f, 0.5f, -5.0f); glVertex3f(-1.0f, 1.5f, -5.0f); glVertex3f(-1.5f, 0.5f, -5.0f); glEnd(); //End triangle coordinates glutSwapBuffers(); //Send the 3D scene to the screen } int main(int argc, char** argv) { //Initialize GLUT glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(400, 400); //Set the window size //Create the window glutCreateWindow("Basic Shapes - videotutorialsrock.com"); initRendering(); //Initialize rendering //Set handler functions for drawing, keypresses, and window resizes glutDisplayFunc(drawScene); glutKeyboardFunc(handleKeypress); glutReshapeFunc(handleResize); glutMainLoop(); //Start the main loop. glutMainLoop doesn't return. return 0; //This line is never reached } |
Now apply make command to compile and build the program. And then as in our Imakefile output file name was program.out type ./program.out to display output.
$ make c++ -m32 -O2 -fno-strength-reduce -fno-strict-aliasing -I/usr/include \ -I/usr/include -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE\ -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE \ -D_FILE_OFFSET_BITS=64 -c -o main.o main.cpp rm -f program.out g++ -o program.out -O2 -fno-strength-reduce -fno-strict-aliasing -g -L/usr/lib\ main.o -L/usr/lib -lglut -lGLU -lGL -L/usr/lib -lXmu -lXi -lXext -lX11 -lm -lpthread make: *** No rule to make target `program.out.man', needed by `program.out._man'. Stop. |
It is not a must that you have to use an Imakefile to compile sources. You can use simple makefiles.
For example a file named makefile with following contents will serve the same purpose.
For example a file named makefile with following contents will serve the same purpose.
CC = g++ CFLAGS = -Wall PROG = basicshapes SRCS = main.cpp ifeq ($(shell uname),Darwin) LIBS = -framework OpenGL -framework GLUT else LIBS = -lGL -lGLU -lglut endif all: $(PROG) $(PROG): $(SRCS) $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS) clean: rm -f $(PROG) |
An easy tutorial on makefile here.
http://mrbook.org/tutorials/make
http://mrbook.org/tutorials/make
No comments:
Post a Comment