簡體   English   中英

GLFW未定義對許多事物的引用

[英]GLFW Undefined Reference to many things

過去,我曾嘗試過在多個平台上使用OpenGL在C和C ++上編寫程序,但每次都被可笑的依賴和不可避免地出現的鏈接問題所阻止。

我試圖在Linux系統上使用帶有C ++的GLFW,並使用CMake進行構建,但絕對沒有成功。

的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

project( GL_TEST_PROJECT )

find_package(OpenGL REQUIRED)
if(NOT OPENGL_FOUND)
    message("ERROR: OpenGL not found")
endif(NOT OPENGL_FOUND)

set(GL_LIBRARY GL GLU X11)

add_executable(testgl testgl.cpp)

target_link_libraries(testgl glfw3 Xxf86vm pthread dl Xi Xcursor Xrandr X11 ${GL_LIBRARY} m)

testgl.cpp:

#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
static void error_callback(int error, const char* description)
{
    fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void)
{
    GLFWwindow* window;
    glfwSetErrorCallback(error_callback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);
    while (!glfwWindowShouldClose(window))
    {
        float ratio;
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
        glBegin(GL_TRIANGLES);
        glColor3f(1.f, 0.f, 0.f);
        glVertex3f(-0.6f, -0.4f, 0.f);
        glColor3f(0.f, 1.f, 0.f);
        glVertex3f(0.6f, -0.4f, 0.f);
        glColor3f(0.f, 0.f, 1.f);
        glVertex3f(0.f, 0.6f, 0.f);
        glEnd();
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

make輸出:

Linking CXX executable testgl
//usr/local/lib/libglfw3.a(x11_init.c.o): In function `initExtensions':
x11_init.c:(.text+0x1b8b): undefined reference to `XineramaQueryExtension'
x11_init.c:(.text+0x1ba3): undefined reference to `XineramaIsActive'
//usr/local/lib/libglfw3.a(x11_monitor.c.o): In function `_glfwPlatformGetMonitors':
x11_monitor.c:(.text+0x672): undefined reference to `XineramaQueryScreens'
collect2: error: ld returned 1 exit status
make[2]: *** [testgl] Error 1
make[1]: *** [CMakeFiles/testgl.dir/all] Error 2
make: *** [all] Error 2

我已經嘗試對CMakeLists.txt文件進行了幾種不同的更改,包括刪除和添加了不同的依賴項,但是看來我無處可去。 我需要做什么才能使該程序編譯?

將此添加到“ target_link_libraries()”:

glfw ${GLFW_LIBRARIES} ${X11_LIBRARIES}

然后將其添加到CMakeLists.txt文件中“ include_directories”上方:

#########################################################
# FIND X11
#########################################################
find_package(X11 REQUIRED)
include_directories(${X11_INCLUDE_DIRS})
link_directories(${X11_LIBRARY_DIRS})
add_definitions(${X11_DEFINITIONS})
if(NOT X11_FOUND)
    message(ERROR " X11 not found!")
endif(NOT X11_FOUND)

編輯#2:並嘗試將以下內容添加到CMakeLists.txt

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglfw3 -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lGL -lpthread") 

使用

set(CMAKE_CXX_FLAGS ...)

對我不起作用,但將它們全部添加到

set(GLFW_DEPS X11 Xrandr Xinerama Xxf86vm Xcursor GL dl pthread)

確實使事情正常。

所以,我的target_link_libraries看起來像這樣

target_link_libraries( ${PROJECT_NAME} glfw3 ${GLFW_DEPS} ${GLEW_STATIC_LIBRARY} )

我可能未正確使用CMAKE_CXX_FLAGS ,但您應該嘗試僅添加自己的庫。 請注意這一點,它們的順序很重要,並且取決於您使用的GLFW版本,它們可能會有所不同。

您得到的那個錯誤完全是因為您缺少Xinerama庫。

有兩種方法不必手動添加這些庫:

選項1是使用GLFW_LIBRARIES ,您必須將glfw源包含到您的項目中,如此處所述, 使用Cmake和GLFW源進行構建

選項2將使用find_package的幫助,如下所述: 使用已安裝的GLFW二進制文件進行構建

好像您的計算機上已安裝glfw一樣,因此我建議使用選項2,部分原因是我尚未使選項1正常工作,並且當前必須手動輸入庫。 這是因為我不想在機器上安裝glfw,而將其全部包含在項目中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM