11

I am following this tutorial. I cmake'd and make/make install'd glfw and glew perfectly(as far as I'm aware). However, when I try to compile the sample code...

#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    return 0;
}

... using his linker flags...

-lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi

... I get the following error:

/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_init.c.o): undefined reference to symbol 'XF86VidModeQueryExtension'
/usr/lib/x86_64-linux-gnu/libXxf86vm.so.1: error adding symbols: DSO missing from command line

I Google'd the error and someone suggested adding -lXxf86vm. It got rid of the initial error but added a significant number more:

/usr/local/lib/libglfw3.a(x11_init.c.o): In function `initExtensions':
x11_init.c:(.text+0x1b93): undefined reference to `XineramaQueryExtension'
x11_init.c:(.text+0x1bad): undefined reference to `XineramaIsActive'
/usr/local/lib/libglfw3.a(x11_init.c.o): In function `_glfwCreateCursor':
x11_init.c:(.text+0x22ee): undefined reference to `XcursorImageCreate'
x11_init.c:(.text+0x23c5): undefined reference to `XcursorImageLoadCursor'
x11_init.c:(.text+0x23d5): undefined reference to `XcursorImageDestroy'
/usr/local/lib/libglfw3.a(x11_monitor.c.o): In function `_glfwPlatformGetMonitors':
x11_monitor.c:(.text+0x743): undefined reference to `XineramaQueryScreens'

How do I figure out what flags I need? If it matters this is how my makefile is structured:

CC = g++
COMPILER_FLAGS = -std=c++11
FILES = *.cpp
LINKER_FLAGS =   -lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -lXxf86vm
OBJS = *.o
LINUX_BIN = HelloWindow

#Compile(output into error.txt if there is an error), link, then run
linux:
    $(CC) $(COMPILER_FLAGS) -c $(FILES) 2> "errors.txt"
    $(CC) $(COMPILER_FLAGS) $(OBJS) -o $(LINUX_BIN) $(LINKER_FLAGS)
    ./$(LINUX_BIN)        

Thanks!

Moo
  • 3,369
  • 4
  • 22
  • 41

1 Answers1

31

Derhass was correct. The following are the flags I used:

-lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread
Peter O.
  • 32,158
  • 14
  • 82
  • 96
Moo
  • 3,369
  • 4
  • 22
  • 41
  • 1
    I was also able to use this Answer when working on getting GLFW v2 to compile and link as a static object. – Cory Trese Nov 01 '15 at 19:44
  • 6
    I also had to add the `-ldl` flag on Ubuntu, and was able to remove the `-lrt` and `-lm` flags. I think it all comes down to what combination of packages/how they're installed, but this list is all-including which is great. – Elian Kamal Aug 13 '16 at 08:22