【问题标题】:Makefile Issues with C++ & GtkmmC++ 和 Gtkmm 的 Makefile 问题
【发布时间】:2018-01-27 19:03:51
【问题描述】:

我熟悉 Gtkmm 和 C++,但对 Makefiles 很陌生,并且在让我的实际生成可执行文件时遇到问题。我知道一个完整的 Makefile 对于我当前的项目的简单性来说是多余的,但我正在尝试将一个基本模板放在一起以用于更大的项目。我在 Ubuntu 17.10 上并从我的“构建”文件夹中运行 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);
}

【问题讨论】:

    标签: c++ ubuntu makefile gnu-make gtkmm


    【解决方案1】:

    如果您想使用$(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
    

    到你的makefile顶部的变量设置。看 VPATH.

    旁白

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

    对于defining variables,使用简单扩展 - VAR := val - 而不是 递归扩展 - VAR = val - 除非需要递归扩展,它不在您的 makefile 中。

    您的 makefile 缺少 clean 目标 删除所有 make-prodicts 并将构建目录恢复到原始目录 状态。提供这个虚假目标是标准的。

    【讨论】:

    • 很抱歉延迟响应,但感谢您提供有关 makefile 如何处理通配符和路径的一些见解。我缺少的关键是 notdir 标记和正确使用 vpath 来指定 src 以使模式规则正常工作。
    【解决方案2】:

    据我所知,

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

    结果

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

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

    【讨论】:

    • 我的目标是让它使用 /src/ 中的 .cpp 文件,然后将 .o 和其他文件转储到 build 中,以免它们与源代码混在一起。我可以完全删除 build 文件夹并将 Makefile 放在 src 中,但是随着添加完整的类,它会变得混乱。你知道我如何编辑我的 Makefile 来做到这一点吗?我正在使用 DEPDIR 变量来引用 src,但我对 make 语法不够熟练,无法确定它可能丢失的位置。
    • @ColePearson 为什么不先编写没有变量的makefile?先让它工作,然后再担心抽象出来的东西。
    • 之前我能够成功删除 vars 并运行它来编译 main.cpp,但现在我的重点是使其半通用以应用于 gtkmm 软件而无需查看找到所有必要值的来源。除非我遗漏了什么,否则我认为我发现问题的根源是需要将 '../src/' 添加到 SRCS 中值的开头,因为它们是使用 .cpp 复制到 .o 更改进入OBJS。那就是在将 .o 文件放入 src 时使其工作,但防止这是我最初的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多