【问题标题】:Makefile not building objects how I'm telling it toMakefile 没有按照我的说法构建对象
【发布时间】:2018-08-01 12:48:26
【问题描述】:

这是我的项目目录文件树:

.
├── entity.cpp
├── entity.hpp
├── entitytypes.hpp
├── main.cpp
├── Makefile
├── player.cpp
└── player.hpp

Makefile的内容是这样的:

CC=g++
CFLAGS=-Wall -pg
LDFLAGS=-lsfml-graphics -lsfml-window -lsfml-system
EXE=gametest

all: $(EXE)

%.o: %.c
    $(CC) -c $< -o $@ $(CFLAGS)

$(EXE): main.o entity.o player.o
    g++ $^ -o $@ $(LDFLAGS)

很奇怪,这是我输入make时的输出:

g++    -c -o main.o main.cpp
g++    -c -o entity.o entity.cpp
g++    -c -o player.o player.cpp
g++ main.o entity.o player.o -o gametest -lsfml-graphics -lsfml-window -lsfml-system

如您所见,输出的最后一行对应于 Makefile 的 $(EXE) 部分。它将程序与正确的标志等链接起来。我的问题是,在构建每个单独的目标文件时,根本没有考虑到我的%.o: %.c 规则。这一点很清楚,因为当它构建对象时,g++-c 之间有很长的差距,我没有写。此外,它错过了我的 $(CFLAGS)。更奇怪的是,当我注释掉 %.o: %.c 部分时,Makefile 会完全相同做同样的事情。

在我看来,它似乎在使用某种默认的构建命令,而忽略了我的。

我查看了我过去编写的 Makefile,据我所知,它们以相同的方式使用完全相同的宏,所以我很困惑为什么会发生这种情况。

【问题讨论】:

  • %.o: %.c 更改为 %.o: %.cpp :-)

标签: c++ makefile


【解决方案1】:

您将文件命名为 *.cpp,而您的规则命名为 *.c,这就是原因。

【讨论】:

  • 你和@Galik 都是对的,我因为没有注意到这一点而自责。我会尽快接受你的回答。
【解决方案2】:

它看起来像是为C 转换了一半的 Makefile。它使用错误的变量并查找C 文件而不是C++。试试这个(未经测试):

CXX := g++
CXXFLAGS := -Wall -pg
LDFLAGS := -lsfml-graphics -lsfml-window -lsfml-system
EXE := gametest

all: $(EXE)

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

$(EXE): main.o entity.o player.o
    $(CXX) -o $@ $^ $(LDFLAGS)

C++ 使用CXXC 使用CC,与CXXFLAGS 相同。

注意:记住缩进是TABs 而不是空格!

【讨论】:

    【解决方案3】:

    内置的%.o: %.cpp规则使用CXX(不是CC)来指定编译器,以及CXXFLAGS(不是CFLAGS)为旗帜。所以重写你的 Makefile 来设置这些变量,你不需要自己指定模式规则:

    CXX = g++
    CXXFLAGS = -Wall -Wextra -pg
    LIBS = -lsfml-graphics -lsfml-window -lsfml-system
    
    gametest: main.o entity.o player.o
    gametest: LINK.o = LINK.cc
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多