C++ & Gtkmm 的 Makefile 问题

Makefile Issues with C++ & Gtkmm

本文关键字:Makefile 问题 Gtkmm C++      更新时间:2023-10-16

我熟悉 Gtkmm 和 C++,但对 Makefiles 很陌生,并且在让我实际生成可执行文件时遇到问题。我知道一个完整的 Makefile 对于我项目的当前简单性来说是矫枉过正的,但我正在尝试将一个基本模板放在一起以用于大型项目。我在 Ubuntu 17.10 上并从我的"build"文件夹运行make命令。任何帮助将不胜感激!

终端输出

pearscol@UBUNTU-1710:~/projects/testprogram/build$ make
g++ -o testprogram  `pkg-config --libs gtkmm-3.0`
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In 
function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:19: recipe for target 'testprogram' failed
make: *** [testprogram] Error 1

源文件结构

- /build
- /build/Makefile
- /src
- /src/main.cpp

/build/Makefile

CXX = g++
CXXFLAGS = `pkg-config gtkmm-3.0 --cflags` -std=c++14 -g -Wall
INCLUDES = -I../include
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
PROGRAM = testprogram
DEPDIR = ../src/
LIBS = `pkg-config --libs gtkmm-3.0`
all: $(PROGRAM)
-include $(OBJS:%.o=$(DEPDIR)/%.Po)
%.o: %.cpp
$(CXX) -MT $@ -MD -MP -MF $*.Tpo -c -o $@ $(CXXFLAGS) $<
$(PROGRAM): $(OBJS)
$(CXX) -o $(PROGRAM) $(OBJS) $(LIBS)
# DO NOT DELETE THIS LINE -- make depend needs it

/src/main.cpp

#include <gtkmm.h>
int main(int argc, char *argv[]) {
Glib::RefPtr<Gtk::Application> app =
Gtk::Application::create(argc, argv, "testprogram");
Gtk::Window window;
window.set_default_size(400, 200);
window.set_title("Tutorial");
return app->run(window);
}

如果要使用$(wildcard ...)函数指定源文件, 然后替换:

SRCS = $(wildcard *.cpp)

跟:

SRCS = $(wildcard src/*.cpp)

因为src*.cpp文件相对于构建目录的位置。

要将目标文件放在构建目录中,请替换:

OBJS = $(SRCS:.cpp=.o)

跟:

$(notdir $(SRCS:.cpp=.o))

最后执行以下操作之一:

替换模式规则:

%.o: %.cpp

跟:

%.o: src/%.cpp

或者,将模式规则保留原样并添加:

VPATH := src

到生成文件顶部的变量设置。看 VPATH。

旁白

您的默认目标all是一个虚假目标:您永远不会 一个名为all的文件,并且您假设不会存在这样的文件。最好将其指定为.PHONY目标。

要定义变量,请使用简单扩展 -VAR := val- 而不是 递归扩展 -VAR = val- 除非需要递归扩展,而它不在您的 makefile 中。

您的生成文件缺少 的clean目标 删除所有生成建议并将构建目录恢复到其原始状态 州。提供这种虚假目标是标准的。

据我所知,

$(CXX) -o $(PROGRAM) $(OBJS) $(LIBS)

结果在

g++ -o testprogram  `pkg-config --libs gtkmm-3.0`

因为$(OBJS)为空,因为$(SRCS)为空,因为*.cpp不匹配任何文件,因为您的build目录不包含.cpp文件。