Programming in OpenGL (attempting to) and I put -lglew and -lfreeglut into Project>properties>build>linker>compilation line>additional options

Here is my code:

#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/freeglut.h>
#include <iostream>
#include <cstdio>
// Local Utilities Includes
#include "vgl.h"
#include "LoadShaders.h"
using std::cerr;
using std::endl;
// Some constants (different from book)
const int Triangles = 0; // The index of the "Triangles" vertex array
const int NumVAOs = 1; // The number of vertex array objects (VAOs)
const int ArrayBuffer = 0; // The index of the array buffer (0)
const int NumBuffers = 1; // The total number of buffers
const int vPosition = 0; // The starting index of the vertex position attribute
GLuint VAOs[NumVAOs]; // An array of vertex array objects
GLuint Buffers[NumBuffers]; // An array of buffers
const GLuint NumVertices = 6; // 6 total vertices in 2 triangles
void init()
// Have OpenGL allocate NumVAOs vertex array object names for our use
// The IDs of these objects are returned in the VAOs array
glGenVertexArrays(NumVAOs, VAOs);
// Bind a vertex array object by creating one (with the name provided
// as an argument) and set that object to "active"
// If 0 is passed in, returns vertex objects to default state
// GL_INVALID_OPERATION error generated if array is not a valid value
// Create an array of vertices
GLfloat vertices[NumVertices][2] = {
{ -0.9, -0.9 },
{ 0.85, -0.9 },
{ -0.9, 0.85 },
{ 0.9, -0.85 },
{ 0.9, 0.9 },
{ -0.85, 0.9} };
// Same with glGenVertexArrays, but do so with buffers
glGenBuffers( NumBuffers, Buffers );
// Bind the current one as an array buffer
glBindBuffer( GL_ARRAY_BUFFER, Buffers[ArrayBuffer] );
// Provide data for the bound array buffer from our vertices array
// Could generate a GL_OUT_OF_MEMORY error
glBufferData( GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW );
// At least two shaders MUST be supplied:
// 1) vertex shader, which will set vertex data
// 2) fragment shader, which will deal with primitives
ShaderInfo shaders[] = {
{GL_VERTEX_SHADER, "triangles.vert"},
{GL_FRAGMENT_SHADER, "triangles.frag"},
// Helper function to load the shaders (in downloadable code in book)
GLuint program = LoadShaders( shaders );
// Runs the shaders
glUseProgram( program );
// Connect shader's 'in' variable with vertex attribute array
glVertexAttribPointer( vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
// Enable the vertex attribute array
glEnableVertexAttribArray( vPosition );
// Function to draw stuff
void display()
// Clears the given framebuffer (in this case, color)
// Could set color to clear to with glClearColor, default is black
// Where should we put a call to clearColor?
// Same as in init, we want to use the Triangles vertex array object
// Draw routine, send vertex array to OpenGL rendering pipeline
// Draw triangles, starting at offset = 0, and going to NumVertices
// What happens when mode is changed?
glDrawArrays(GL_TRIANGLES, 0, NumVertices);
// Force OpenGL commands to begin execution
int main(int argc, char* argv[])
// First, initialize data structures and arguments needed by glut
glutInit(&argc, argv);
// We're displaying in RGBA color space
// We want a window that 512 by 512 pixels
glutInitWindowSize(512, 512);
// We're using OpenGL 4.4 (you should change this to fit yours, need 3.2)
    /usr/bin/ld: cannot find -lglew
    /usr/bin/ld: cannot find -lfreeglut

// Create the window, and call it the name of the first argument)
// To be safe, we're using glew's experimental stuff.
// Initialize and error check GLEW
GLenum err = glewInit();
if (GLEW_OK != err)
// If something went wrong, print the error message
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));

// Initialize the display in our program
// The display callback...function called whenever image is redrawn
// Infinite looping, calling idle function over and over
return 0;

then when I run the program the debug console error says:

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/home/connor/NetBeansProjects/HelloWorldOpenGL'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/helloworldopengl
make[2]: Entering directory `/home/connor/NetBeansProjects/HelloWorldOpenGL'
mkdir -p dist/Debug/GNU-Linux-x86
g++     -o dist/Debug/GNU-Linux-x86/helloworldopengl build/Debug/GNU-Linux-x86/main.o  -lglew -lfreeglut
/usr/bin/ld: cannot find -lglew
/usr/bin/ld: cannot find -lfreeglut
collect2: error: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/helloworldopengl] Error 1
make[2]: Leaving directory `/home/connor/NetBeansProjects/HelloWorldOpenGL'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/connor/NetBeansProjects/HelloWorldOpenGL'
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 111ms)

Am I supposed to do something other than the make all and make install commands while in the directory? I copied over the .h files to /usr/include/GL and the .a files from opengl-redbook.com into /usr/bin manually before I read about the make commands


1 Answer 1


To correctly build your project on Ubuntu, you need to install the following development (-dev) packages, open a terminal and type:

sudo apt-get install libglew1.5-dev libglew-dev libglewmx1.5-dev libglewmx-dev freeglut3-dev build-essential

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.