【问题标题】:C++ Makefile. .o in different subdirectoriesC++ 生成文件。 .o 在不同的子目录中
【发布时间】:2015-05-27 23:27:48
【问题描述】:

我在尝试将 .o 文件放入单独的目录 (/build) 时遇到了一些问题。 实际上,我的源代码(在 /src 中)包含一些子目录,而我的 Makefile 仅创建包含在第一个“级别”中的 .cpp 的 .o。其他 .o 只是被忽略,因此无法创建目标。 在我的 /src 目录中,我有“三个级别”(src/first/second/)。 这是 Makefile 的代码:

CC=g++
CFLAGS=-W -Wall -ansi -pedantic -s -O3 -Os -std=c++11 -fpermissive
LDFLAGS= -lboost_system -lboost_regex

SRCDIR=src
HEADDIR=include
LIBDIR=build
BINDIR=bin

BIN=LTN
SRC = $(wildcard src/*.cpp src/*/*.cpp src/*/*/*.cpp)
OBJ = $(patsubst %.cpp,$(LIBDIR)/%.o,$(SRC))

all: $(BIN)

LTN: $(OBJ)
    $(CC) -o $(BINDIR)/$@ $^ $(LDFLAGS)

$(LIBDIR)/$(SRCDIR)/%.o: $(SRCDIR)/%.cpp $(HEADDIR)/%.h
    $(CC) -o $@ -c $< $(CFLAGS)

.PHONY = clean

【问题讨论】:

  • 我假设你的意思是 make 不知道如何为$(SRCDIR) 下一级以上的源文件构建.o 文件?如果是这种情况,那是因为$(SRCDIR) 中的文件只有一个模式规则。
  • 是的,这正是我的意思 :) 我必须为每个 src 级别编写一个规则吗?
  • 最简单的,是的。可能有更复杂的解决方案(可能使用vpath)可以让您避免这种情况,但它们是否值得是另一个问题。

标签: c++ object makefile directory


【解决方案1】:

你可以试试这个:

CC=g++
CFLAGS=-W -Wall -ansi -pedantic -s -O3 -Os -std=c++11 -fpermissive
LDFLAGS= -lboost_system -lboost_regex

SRCDIR=src
HEADDIR=include
LIBDIR=build
BINDIR=bin

BIN=LTN
SRC=$(shell find . -name '*.cpp')
TMP=$(subst $(SRCDIR),$(LIBDIR), $(SRC))
OBJ=$(patsubst %.cpp,%.o,$(TMP))

all: $(BIN)

LTN: $(OBJ)
    @[ ! -d $(BINDIR) ] & mkdir -p $(BINDIR)
    $(CC) -o $(BINDIR)/$@ $^ $(LDFLAGS)

$(LIBDIR)/%.o: $(SRCDIR)/%.cpp  
    @[ ! -d $(dir $@) ] & mkdir -p $(dir $@)
    $(CC) -o $@ -c $< $(CFLAGS)

.PHONY = clean  

【讨论】:

  • 感谢您的回答!我刚刚尝试过,它在 /src 文件夹中创建 .o,而不是在 /build :(
  • 再试一次,给我反馈~
  • 再次感谢您! make 在正确的位置创建了所有 .o,但我得到了一些错误: Undefined symbols for architecture x86_64: ......................... (几乎每个类都有一条消息)....... 注意:缺少 vtable 通常意味着第一个非内联虚成员函数没有定义。 “_main”,引用自:主要可执行文件 ld 的隐式入口/启动:未找到体系结构 x86_64 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)make:*** [ LTN] 错误 1
  • 你应该使用 $(LIBDIR)/%.o: $(SRCDIR)/%.cpp 代替。
  • 这些仍然只是我在代码中更正的一个细节。在 $(LIBDIR)/%.o: $(SRCDIR)/%.cpp,我添加了 $(HEADDIR)/%.h 以确保检查 .h 是否已更改。这样做,我得到“找不到 main.o 的规则”(因为缺少 main.h)。为了解决这个问题,我创建了一个空的 main.h(我知道它不是顶部!!),现在它运行良好 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多