【问题标题】:glad.c unable to find glad/glad.h, but main.cpp canglad.c 找不到glad/glad.h,但是main.cpp 可以
【发布时间】:2021-08-14 04:41:29
【问题描述】:

我一直在尝试使用 glfw3 和 GLAD 为 OpenGL 设置构建环境。我目前正在使用带有 X 服务器的 WSL2 Ubuntu 进行编译和生成文件。

但是,当我运行我的 make 时,我收到以下错误:

src/glad.c:25:10:致命错误:glad/glad.h:没有这样的文件或目录 25 | #include

这对我来说很奇怪,因为 makefile 似乎能够编译 main.cpp 文件并创建一个 main.o,尽管还包括“glad/glad.h”

文件结构:

-HelloTriangle
--include
---glad
----glad.h
---KHR
----khrplatform.h
--src
---glad.c
---main.cpp
--makefile

这是我的制作文件:

BASE_OBJS = main.o glad.o

SRC_PATH = src

OBJS = $(addprefix $(SRC_PATH)/, $(BASE_OBJS))
CXX = g++
CXXFLAGS = -g -Iinclude
LDFLAGS =
LDLIBS = -lglfw -lGL -lX11 -lpthread -lXrandr -lXi -ldl

HelloTriangle: $(OBJS)
    $(CXX) -o $@ $(LDFLAGS) $^ $(LDLIBS)    

clean:
    rm $(OBJS)

这是我的 main.cpp:

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>

#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

/*
Function to handle window resizing
*/
void framebuffer_size_callback(GLFWwindow* window, int width, int height);

int main() {
    /* 
    Initialize GLFW
    Sets version to Core profile 3.3
     */
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    /* 
    Initialize a window context for OpenGL
    Defines the windows width, height, and title
     */
    GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Hello Triangle", NULL, NULL);
    if(window == NULL) {
        std::cout << "Failed to create GLFW window" <<std::endl;
        glfwTerminate();
        return -1;
    }

    /* 
    Initialize GLAD
    Handles OS-specific function pointers
    */
    if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    /*
    Handle window resizing
    */
    glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    /*
    Render loop
    */
    while(!glfwWindowShouldClose(window)) {
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); }

【问题讨论】:

  • 注意 C 和 C++ 是不同的语言。使用 C 编译器编译 C++ 代码比使用 C++ 编译器编译 C 代码更有可能得到奇怪的结果,但需要注意这一点。
  • 等一下。我上面的评论可能是废话。我看到了将对象链接在一起的规则,但是代码到对象的规则在哪里?
  • 我依赖于 GNU 默认模式规则的代码到对象规则(在这里找到:gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html
  • 虽然通读它,但我认为可能是因为它是一个 c 文件而不是 c++,它没有使用我期望的默认规则。
  • 你没有明确的规则来编译 C 文件,所以 make 使用 implicit rules 并且那些从环境变量中获取它们的标志。对于C,您需要设置CPPFLAGS

标签: c++ opengl makefile glad


【解决方案1】:

您似乎设置了 CXXFLAGS(用于 C++ 编译器),但您的glad.c 是使用 C 编译器(检查 CFLAGS)编译的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多