【问题标题】:Makefile linkingMakefile 链接
【发布时间】:2017-06-14 21:07:35
【问题描述】:

我遇到了 make 的问题。我有 3 个文件。

main.cpp | src/数学/Vector2.cpp | src/Math/Vector2.hpp

这是我的 MakeFile:

main: vector2.o main.o
    g++ -o main.o vector2.o

main.o: main.cpp
    g++ -o main.o main.cpp -c

vector2.o: src/Math/Vector2.cpp src/Math/Vector2.hpp
    g++ -o vector2.o src/Math/Vector2.cpp -lm -c

当我手动复制这些命令时,它编译得非常好。 但是 $make main 返回

g++     main.cpp   -o main
/tmp/ccnRZ4UD.o: In function `main':
main.cpp:(.text+0x42): undefined reference to ` 
phy2d::Maths::Vector2f::Vector2f(double, double)'
main.cpp:(.text+0x66): undefined reference to ` 
phy2d::Maths::Vector2f::Vector2f(double, double)'
main.cpp:(.text+0x79): undefined reference to ` 
phy2d::Maths::Vector2f::distance(phy2d::Maths::Vector2f const&) 
const'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'main' failed
make: *** [main] Error 1

有什么想法吗??

【问题讨论】:

  • 尝试运行make --dry-run,这将向您显示确切的命令 make 执行。那你应该能找到这个错误发生在哪一步,为什么...
  • g++ main.cpp -o main 这与 Makefile 中的内容不同。 Makfile 有额外的-c
  • 无论如何,你的 makefile 看起来有问题。它不会生成 main 可执行文件。有两个目标都产生main.o

标签: c++ linux makefile linker


【解决方案1】:

您提供的 makefile 不可能提供您显示的输出。

您在评论中说这是我的 MakeFile。请注意,make 不会读取名为 MakeFile 的文件。它将读取名为Makefilemakefile 的文件,但如果您使用区分大小写的文件系统,那么您所看到的行为的一种解释是您使用MakeFile 作为您的makefile 名称和@987654326 @找不到。

或者,您的问题可能只是不精确,但这不可能是 make 出于其他原因使用的 makefile。

另外,你的 makefile 有很多错误:

  1. 您有两个不同的目标mainmain.o,其中命令生成相同的文件-o main.o
  2. 您正在将库-lm 添加到vector2.o 的编译行;图书馆应该在链接线上。

一般来说,您应该使用automatic variables 来确保您的makefile 与您希望它执行的操作一致。

这是适合您情况的合理生成文件:

CXX = g++

main: vector2.o main.o
        $(CXX) -o $@ $^ -lm

main.o: main.cpp
        $(CXX) -c -o $@ $<

vector2.o: src/Math/Vector2.cpp src/Math/Vector2.hpp
        $(CXX) -c -o $@ $<

【讨论】:

  • g++ -o main main.o vector2.o 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2011-09-29
  • 2012-09-12
相关资源
最近更新 更多