0

所以我的任务很简单,我创建了 makefile(使用 makefile 新建),我想将我的 .o 文件保存在不同的文件夹中,以便拥有一个更干净的目录并允许其他人使用 .o 文件。

我搜索并发现许多解决方案指向使用 -o $< $@

但是,它给了我g++: cannot specify -o with -c or -S with multiple files

这就是我想要做的:

$(OBJECT_PATH)/file1.o: $(SOURCE_PATH)/file2.cpp $(SOURCE_PATH)/file1.cpp
        $(CC) $(CFLAGS) $(SOURCE_PATH)/file2.cpp $(SOURCE_PATH)/file1.cpp -o $@

file1.cpp 有#include "file1.h",所以从我读到的内容中,我应该在依赖项中包含 file1.cpp。但是,现在我无法导出到其他目录。

有解决办法吗?还是我的概念错了?

4

2 回答 2

1

使用make -d甚至更好地重新制作 -x来了解调用了哪些命令。

还可以运行make -p 以了解使用了哪些内置规则。

我们无法为您提供更多帮助,因为我们不知道您是否重新定义了CFLAGS.

并且 C++ 编译最好用g++isCXX和来完成CXXFLAGS,例如用(我从我的make -p输出中提取这个)

LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
CXX = g++
%.o: %.cc
      $(COMPILE.cc) $(OUTPUT_OPTION) $<

我强烈建议CXXFLAGS= -Wall -g至少在开发阶段拥有。还学习使用gdband valgrind

你可以在你的Makefile

 CXXFLAGS= -g -Wall
 SOURCES=f1.cc f2.cc
 SOURCE_PATH=yoursourcedir/
 OBJECT_PATH=yourobjectdir/
 SRCFILES=$(patsubst %.cc,$(SOURCE_PATH)/%.cc,$(SOURCES))
 OBJFILES=$(patsubst %.cc,$(OBJECT_PATH)/%.o,$(SOURCES))
 PROGFILE=$(OBJECT_PATH)
 .PHONY: all clean
 all: $(PROGFILE)
 $(PROGFILE): $(OBJFILES)
         $(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
 $(OBJECT_PATH)/%.o: $(SOURCE_PATH)/%.cc
         $(COMPILE.cc)  $(OUTPUT_OPTION) $<
 clean:
         $(RM) $(OBJECT_PATH)/*.o $(PROGFILE)
于 2012-11-01T10:55:44.317 回答
1

尝试

$(OBJECT_PATH)/file1.o: $(SOURCE_PATH)/file2.cpp $(SOURCE_PATH)/file1.cpp
    $(CC) $(CFLAGS) $^ -c $@

并检查 CFLAGS 不包含 -o -c 或 -s 标志

还阅读了隐含规则。它可能会帮助您组织您的 makefile

于 2012-11-01T10:57:07.173 回答