首页 > 解决方案 > 如何在 macOS 上使用 Makefile?

问题描述

在 macOS 上,如果我用

clang -I. -framework OpenGL main.cpp glad.c /usr/local/Cellar/glfw/3.3.1/lib/libglfw.3.3.dylib

我可以从以下代码构建并运行生成的可执行文件:

#define GL_SILENCE_DEPRECATION

#include <stdio.h>
#include "glad/glad.h"
#include "/usr/local/Cellar/glfw/3.3.1/include/GLFW/glfw3.h"

int main(void)
{
    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 */
        glClearColor(0.9, 0.1, 0.1, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);

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

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

    glfwTerminate();
    return 0;
}

但我想使用 Makefile 构建,所以我准备了

CC         = clang
XXFLAGS    = -g -Wall -v
CPPFLAGS   = -I.
LDLIBS     = -lm -L/usr/local/Cellar/glfw/3.3.1/lib -lglfw
LDFLAGS    = -framework OpenGL
OBJS       = main.o glad.o 
PROGRAM    = main

$(PROGRAM): $(OBJS)
    $(CXX) $^ $(XXFLAGS) $(CPPFLAGS) $(LDLIBS) $(LDFLAGS) -o $@

clean:
    -rm -f *.o

distclean: clean
    -rm -Rf $(PROGRAM) 

它实际上是可执行文件,但是当我运行它时,我得到了

$ ./main 
Segmentation fault: 11

所以我猜Makefile有问题,对吧?

$ make -n
c++  -I.  -c -o main.o main.cpp
clang  -I.  -c -o glad.o glad.c
c++ main.o glad.o -g -Wall -v -I. -lm -L/usr/local/Cellar/glfw/3.3.1/lib -lglfw -framework OpenGL -o main

标签: c++macosmakefileglfw

解决方案


您没有定义要构建的规则OBSJ,因此make使用了它的内置规则。该PROGRAM规则仅链接目标文件,没有必要CPPFLAGS在那里指定。


推荐阅读