【问题标题】:Makefile export .o file to a different path than .cppMakefile 将 .o 文件导出到与 .cpp 不同的路径
【发布时间】:2012-11-01 10:45:58
【问题描述】:

所以我的任务很简单,我已经创建了 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。但是,现在我无法导出到其他目录。

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

【问题讨论】:

  • 为什么你有一个单个 file1.o 取决于两个 源文件file2.cppfile1.cpp ?这很不寻常.... 通常file1.o 依赖于file1.cpp 和其他头文件,而file2.o 依赖于file2.cpp 和其他头文件.... 整个可执行文件由file1.o 和@ 组成987654331@ etc.. 与一些库链接。

标签: linux ubuntu makefile


【解决方案1】:

使用make -d 甚至更好的remake -x 来了解调用了哪些命令。

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

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

C++ 编译最好使用g++CXXCXXFLAGS,例如与(我从我的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。还要学习使用gdbvalgrind

您的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)

【讨论】:

  • 链接失败。你知道为什么吗?它给函数提供了未定义的引用
  • 链接步骤中缺少某些目标文件或库,或者链接命令的参数顺序不正确。除非您不解释到底是什么失败了,否则无法提供更多帮助。
  • 哦,我明白了。我不知道这些论点必须是有序的。您能否解释或提供有关如何下订单的链接。谢谢
【解决方案2】:

试试

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

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

还阅读了有关隐式规则的内容。它可能会帮助你组织你的makefile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多