【问题标题】:SDL Max OSX via Homebrew, Makefile not quite workingSDL Max OSX 通过 Homebrew,Makefile 无法正常工作
【发布时间】:2017-01-07 18:37:43
【问题描述】:

我已经通过自制软件安装了 SDL,如果我直接在终端中输入以下命令,它可以与我的测试程序完美配合:

 g++ -O3 -g -Wall -Wextra -std=c++1y hello.cpp hello_main.cpp `sdl2-config --cflags --libs` -o hello

但不幸的是,我尝试编写一个 makefile(我肯定需要一个)产生了不成功/无法解释的结果。 我正在关注这个,但我的配置不同/我没有指定 Cocoa(我不需要)所以我希望我遇到的问题可能部分是由于我的不同要求: Compiling SDL on OS X with makefile 示例:

CC=g++
CFLAGS=-c -Wall
SDLFLAGS=`sdl-config --cflags --libs` -framework Cocoa
SOURCES=main.cpp Game.cpp IO.cpp Board.cpp Pieces.cpp Piece.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=tetris

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
 $(CC) $(OBJECTS) $(SDLFLAGS) -o $@

.cpp.o:
 $(CC) $(CFLAGS) $< -o $@

clean:
 rm -rf *.o $(EXECUTABLE)

到目前为止我的makefile:

CXX       = g++
CXXFLAGS  = -c -O3 -g -Wall -Wextra -std=c++1y
SDLFLAGS  = `sdl2-config --cflags --libs`
SOURCES   = hello_main.cpp hello.cpp 
OBJECTS   = $(SOURCES:.cpp=.o)
EXECNAME  = hello

all: $(SOURCES) $(EXECNAME)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) $ (OBJECTS) $(SDLFLAGS) -o $@

.cpp.o:
    $(CXX) $(CXXFLAGS) $< -o $@

clean :
    -rm -f *.o *.core $(EXECNAME)

在我的 .hpp 头文件中,如果我 #include &lt;SDL.h&gt; 并运行单行命令,一切都会成功。如果我尝试上面的makefile,则找不到,但是如果我将指令更改为#include &lt;SDL2/SDL.h&gt;,则会发现该库。然而控制台输出如下:

g++ -c -O3 -g -Wall -Wextra -std=c++1y    hello.cpp   -o hello

这很奇怪。

运行 ./hello 产生“permission denied”错误,确认链接和编译不成功。 每个人的系统都有点不同,到目前为止我发现的问题对这种情况没有帮助。 我非常接近让这个工作(但话又说回来,我将如何开始在 IDE 中使用它?我想只要我可以导入固定的 makefile 或仅从终端/编辑构建来自 IDE,我很好。)

我需要对 makefile 进行哪些更改? 谢谢。

编辑:

变体 1:

CXX         = g++
CXXFLAGS    = -O3 -g -Wall -Wextra -std=c++1y -c
SDLCFLAGS   = `sdl2-config --cflags`
SDLLIBFLAGS = `sdl2-config --libs`

SOURCES   = hello_main.cpp hello.cpp 
OBJECTS   = $(SOURCES:.cpp=.o)
EXECNAME  = hello

all: $(SOURCES) $(EXECNAME)

$(EXECUTABLE): $(OBJECTS)
    $(CXX) $ (OBJECTS) $(SDLLIBFLAGS) -o $@

.cpp.o:
$(CXX) $(CXXFLAGS) $(SDLCFLAGS) $< -o $@

clean :
    -rm -f *.o *.core $(EXECNAME)

【问题讨论】:

  • 改用`pkg-config --cflags sdl2 --libs` 试试。

标签: c++ macos makefile sdl-2


【解决方案1】:

我和一个朋友聊天,发现出了什么问题:一堆错别字和奇怪的规则。以下适用于任何需要基本 makefile 的人:

CXX         = g++
CXXFLAGS    = -O3 -g -Wall -Wextra -std=c++1y
#LDFLAGS     = -lSDL2_image
SDLCFLAGS   = $(shell sdl2-config --cflags)
SDLLIBFLAGS = $(shell sdl2-config --libs)

SOURCES   = hello_main.cpp hello.cpp 
OBJECTS   = $(SOURCES:.cpp=.o)
EXECNAME  = hello

all: $(EXECNAME)

$(EXECNAME): $(OBJECTS)
    $(CXX) $(OBJECTS) $(SDLLIBFLAGS) $(LDFLAGS) -o $@

%.o: %.cpp
    $(CXX) -c $(CXXFLAGS) $(SDLCFLAGS) $< -o $@

clean :
    -rm -f *.o *.core $(EXECNAME)

【讨论】:

    【解决方案2】:

    您应该将您的 sdl2-config 分成两部分 - 因为有两个步骤。 sdl2-config --cflags 应该进入编译器步骤 - 这就是您示例中的 .cpp:.o 行。那么链接步骤应该是sdl2-config --libs。第二个似乎适合您的情况,额外的 --cflags 没有害处,但不是必需的。

    【讨论】:

    • 我不确定我是否正确解释了您的答案。我已经编辑了我的问题以包含我认为您所说的内容,但是当我尝试运行时,我仍然得到控制台输出 g++ -O3 -g -Wall -Wextra -std=c++1y -c hello.cpp -o hello-bash: ./hello: Permission denied
    • 尝试file test 看看操作系统说明它是什么类型的文件。也许chmod u+x test 让它可执行,但看起来很奇怪,默认情况下应该没问题。
    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2023-04-01
    • 2020-05-05
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多