Makefile链接

时间:2017-06-14 21:07:35

标签: c++ linux makefile linker

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

main.cpp | src / Math / Vector2.cpp | SRC /数学/ 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

任何想法??

1 个答案:

答案 0 :(得分:3)

您提供的makefile无法显示您显示的输出。

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

或者,你可能在你的问题中只是不精确,但是这不能是因为某些其他原因而使用的makefile。

此外,您的makefile有很多错误:

  1. 您有两个不同的目标mainmain.o,其中命令生成相同的文件-o main.o
  2. 您正在为-lm的编译行添加库vector2.o;图书馆应该在链接线上。
  3. 一般情况下,您应该使用automatic variables来确保您的makefile符合您的要求。

    这是适合您情况的合理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 $@ $<