【问题标题】:Compiling two executables into one C++将两个可执行文件编译成一个 C++
【发布时间】:2020-11-13 10:05:12
【问题描述】:

从技术上讲,这可能不是 makefile 本身的错误,但我想仔细检查它是否存在或其他地方。

我正在尝试使用

CXX = clang++

CXXFLAGS = -Wall -g -o

OBJECTSENC = huffmandec.o huffmanNode.o tree.o heap.o

OBJECTSDEC = huffmandec.o huffmanNode.o

.SUFFIXES: .o .cpp

all: encoder decoder

encoder: $(OBJECTSENC)
    $(CXX) $(CXXFLAGS) encoder $(OBJECTSENC)

decoder: $(OBJECTSDEC)
    $(CXX) $(CXXFLAGS) decoder $(OBJECTSDEC)

huffmanNode.o: huffmanNode.cpp huffmanNode.h
huffmandec.o: huffmandec.cpp huffmanNode.h
huffmanenc.o: huffmanenc.cpp huffmanNode.h tree.h heap.h
tree.o: tree.cpp tree.h
heap.o: heap.cpp heap.h

clean:
    /bin/rm -f *.o *~

但是当我运行它时,我收到一条错误消息,指出我在 huffmandec.cpp 中有一个未定义的对 huffmanNode(int, char) 的引用。通常,这可能会有一个相当简单的解决方案,但是当我分别编译这两者时(仅尝试使一个可执行文件时),它运行得很好。是不是我做错了什么?

编辑: 命令行和错误是

clang++ -Wall -g -o   -c -o huffmandec.o huffmandec.cpp
/tmp/huffmandec-21d583.o: In function `huffmanTree(huffmanNode*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char)':
/autograder/submission/huffmandec.cpp:18: undefined reference to `huffmanNode::huffmanNode(int, char)'
/autograder/submission/huffmandec.cpp:23: undefined reference to `huffmanNode::huffmanNode(int, char)'
/tmp/huffmandec-21d583.o: In function `main':
/autograder/submission/huffmandec.cpp:71: undefined reference to `huffmanNode::huffmanNode(int, char)'
/autograder/submission/huffmandec.cpp:103: undefined reference to `huffmanNode::getChar()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
<builtin>: recipe for target 'huffmandec.o' failed
make: *** [huffmandec.o] Error 1

【问题讨论】:

  • 是编译失败还是链接失败?能不能也加一下命令行和报错信息?
  • 请准确显示您正在运行什么以及输出是什么。我假设缺少的符号应该来自 huffmanNode.o?
  • 如果你使用g++编译器,它的语法会像g++ -o file1 file1.cpp file2.cpp file1.hpp

标签: c++ makefile clang++ huffman-code


【解决方案1】:

您已将-o 标志添加到CXXFLAGS。不要那样做,因为内置规则使用CXXFLAGS 将.cpp 文件编译为.o。在这种情况下,它吃掉了-c 标志,该标志阻止编译器将您的目标文件链接到库或程序中。

【讨论】:

    猜你喜欢
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多