这个makefile有什么问题?

这个makefile有什么问题?,makefile,Makefile,这是我第一次编写makefile。这不起作用(例如,如果我修改ClientSocket.cc,它只会显示“Update”。如果我运行make myprog,还会抛出许多依赖项错误)。你能告诉我这是怎么回事吗? 多谢各位 myprog: myprog.o Client.o ClientSocket.o Socket.o g++ -Wall -g Socket.o ClientSocket.o Client.o myprog.o -o myprog myprog.o: mypr

这是我第一次编写makefile。这不起作用(例如,如果我修改ClientSocket.cc,它只会显示“Update”。如果我运行make myprog,还会抛出许多依赖项错误)。你能告诉我这是怎么回事吗? 多谢各位

myprog: myprog.o Client.o ClientSocket.o Socket.o  
     g++  -Wall -g   Socket.o ClientSocket.o Client.o myprog.o -o myprog

myprog.o: myprog.cc  
    g++ -Wall -g -c myprog.cc

Client.o:  Client.cc Client.h
    g++ -Wall -g -c Client.cc

ClientSocket.o: ClientSocket.cc ClientSocket.h
    g++ -Wall -g -c ClientSocket.cc


Socket.o: Socket.cc Socket.h
    g++ -Wall -g -c Socket.cc
运行make myprog时出错:

   cc   mprog.o   -o myprog
   myprog.o: In function `std::__verify_grouping(char const*,   unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
   myprog.cc:(.text+0xe): undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const'

确保使用制表符缩进命令行(无法判断您是否来自post,因为它们可能会转换为空格)

编辑

cc
行和错误消息来看,make似乎正在使用其进行链接,完全忽略了您提供的链接(第一个)。我在makefile中看不到任何可能导致此问题的内容。还有几件事需要检查:

  • 尝试键入其他规则,例如,
    makeclient.o
    并查看它们是否有效
  • 检查所有文件是否都在当前目录中,并且makefile是否命名为
    makefile
  • 同样,我确信这只是文章中的格式问题,但是你的第一条规则比其他规则缩进了更多的空间。你说你检查过了,我相信你,但我真的看不出还有什么问题

  • 我知道这些建议就像技术支持人员询问你的电脑是否已接通电源一样,但我觉得一切都很好。我甚至复制了它,修正了空白,并在我的机器上运行了它。一切似乎都正常。

    看起来不像是生成文件问题(因为编译器正在被调用)。它看起来像是C++源代码问题。 具体地说,在定义
    std::basic_字符串的头的
    myprog.cc
    中,似乎缺少一个
    #include

    您是否尝试过在不使用make的情况下直接执行编译器命令,以查看源代码是否正确编译

    附录

    运行
    make
    时,可能您的包含路径不同。
    make
    有一个调试/跟踪选项,可以转储它的所有宏(但我不记得它是怎么回事),这可能会有所帮助。

    您是否用大写字母M将文件命名为“Makefile”


    您也可以尝试运行
    make-d
    以获取一些调试信息。

    请正确设置您的帖子格式。每行缩进3个空格,或者从编辑器中选择相应的选项。很抱歉。现在做了。你能告诉我们当你运行
    makemyprog
    时那些依赖错误是什么吗?嗨,蒂姆,上面更新了。是使用cc而不是g++?看起来是这样的。请尝试Loadmaster的建议,然后查看我的编辑。我再次检查。所有g++行前面都有一个选项卡,并且只有一个选项卡。哇。谢谢你,蒂姆。我之前试过1)但不是2)文件名是“MakeFile”而不是“MakeFile”。就这样。成功了。我的错。我应该好好核对一下名字的。再次感谢您抽出时间,没问题。令人沮丧的问题最终总会让你大吃一惊。嗨,Loadmaster,如果我编译单个文件并手动链接它们,程序就能正常编译和工作。makefile可以命名为
    makefile
    makefile
    ,这无关紧要。
              myprog.cc:(.text+0x1a4): undefined reference to `std::cout'
              myprog.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
              collect2: ld returned 1 exit status