Неопределенные ссылки Компиляция OpenGL/glfw/glew в Ubuntu (g++)

Я следую этому руководству. У меня cmake'd и make/make install'd glfw и glew отлично(насколько мне известно). Однако, когда я пытаюсь скомпилировать пример кода...

#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;
}

... используя его флаги компоновщика...

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

... Я получаю следующую ошибку:

/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

Я погуглил ошибку, и кто-то предложил добавить -lXxf86vm. Он избавился от первоначальной ошибки, но добавил значительно больше:

/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'

Как понять, какие флаги мне нужны? Если это имеет значение, вот как устроен мой make-файл:

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)        

Спасибо!


person Dennis Subachev    schedule 05.04.2015    source источник
comment
Для GLFW вам, вероятно, понадобится -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm   -  person derhass    schedule 05.04.2015
comment
Как вы узнали, какие флаги компоновщика использовать?   -  person Dennis Subachev    schedule 05.04.2015
comment
Глядя на неразрешенные символы...   -  person derhass    schedule 05.04.2015
comment
Этот вопрос не является дубликатом :) Я благодарен, что он здесь, мне очень помог ...   -  person sdaau    schedule 10.10.2017


Ответы (1)


Дерхас был прав. Ниже приведены флаги, которые я использовал:

-lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread
person Dennis Subachev    schedule 05.04.2015
comment
Я также смог использовать этот ответ при работе над компиляцией GLFW v2 и компоновкой его как статического объекта. - person Cory Trese; 01.11.2015
comment
Мне также пришлось добавить флаг -ldl в Ubuntu, и я смог удалить флаги -lrt и -lm. Я думаю, что все сводится к тому, какая комбинация пакетов/как они установлены, но этот список включает все, что здорово. - person Elian Kamal; 13.08.2016