首页 > 解决方案 > 尝试通过 Ubuntu 上的 CLion 将 GLFW 从源代码链接到 C++ 项目时出错

问题描述

我正在尝试将 GLFW 从源代码添加到我的项目中。我按照文件中的说明做了,但出现错误。

错误:

/usr/bin/ld:CMakeFiles/mancala_graphics.dir/main.cpp.o:在函数“main”中:

/path/to/clion/mancala_graphics/main.cpp:47:未定义对“glClear”的引用

collect2:错误:ld 返回 1 个退出状态

make[ 3 ]: *** [CMakeFiles/mancala_graphics.dir/build.make:88: mancala_graphics] 错误 1

make[1]: *** [CMakeFiles/Makefile2:115: CMakeFiles/mancala_graphics.dir/all] 错误 2

make[ 2 ]: *** [CMakeFiles/Makefile2:122: CMakeFiles/mancala_graphics.dir/rule] 错误 2

make: *** [Makefile:164: mancala_graphics] 错误 2

源代码如下及其来自文档

#include <GLFW/glfw3.h>


int main() {
    GLFWwindow *window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window) {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window)) {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

CMake 在下面,这也来自文档

cmake_minimum_required(VERSION 3.16)
project(mancala_graphics)

set(CMAKE_CXX_STANDARD 20)

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)


add_subdirectory(Dependencies/GLFW)

add_executable(mancala_graphics main.cpp)

target_link_libraries(mancala_graphics glfw)

下图显示了项目的文件层次结构: 项目的文件层次结构

正如您在图片中看到的那样,gl.h 中似乎定义了 glClearglClear 在 gl.h 中定义

当我转到 gl.h 时,它不在我下载并保存的源文件中,Dependencies//usr/include/GL/gl.h它可能是错误的根源,因为当我打开头文件时,我看到一条警告说该文件不属于任何项目你看:此文件不属于任何项目目标

问题是:这个配置有什么问题,为什么我不能运行文档中的代码片段?

还有一个问题是:如何将 GLFW 从源代码添加到我的项目中?

IDE:克莱恩

操作系统:Linux / Ubuntu

编辑

cmake_minimum_required(VERSION 3.16)
project(mancala_graphics)

set(CMAKE_CXX_STANDARD 20)

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)

find_package(OpenGL REQUIRED)

add_subdirectory(Dependencies/GLFW)

add_executable(mancala_graphics main.cpp)

target_link_libraries(mancala_graphics OpenGL::GL)
target_link_libraries(mancala_graphics glfw)

当我像上面的代码一样编写 cmake 时,但感觉有些不对劲。

标签: c++openglcmakeclionglfw

解决方案


来自GLFW 文档

请注意,glfw 目标不依赖于 OpenGL,因为 GLFW 会在运行时加载它需要的任何 OpenGL、OpenGL ES 或 Vulkan 库。如果您的应用程序直接调用 OpenGL,而不是使用现代扩展加载程序库,请使用 OpenGL CMake 包。

find_package(OpenGL REQUIRED)
target_link_libraries(myapp OpenGL::GL)

如果找到 OpenGL,则 OpenGL::GL 目标将添加到您的项目中,其中包含库和包含目录路径。像上面这样链接。


推荐阅读