• gcc/g++ 编译时出现:“对’xxxx’未定义的引用,collect2: error: ld returned 1 exit status” 的错误


    出现的问题:

    在使用 make 编译实现一个程序时,出现了下面的错误。查看程序源文件所在的目录时发现程序已经完成了编译,并生成了 list_repo.o 的文件,说明是在程序链接生成可执行文件时发生了问题。

    storages/local.o:在函数‘LocalStorage::init(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >&)’中:
    local.cc:(.text+0x2dae):对‘Getload::get_load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)’未定义的引用
    collect2: error: ld returned 1 exit status
    Makefile:32: recipe for target 'bin/list_repo' failed
    make: *** [bin/list_repo] Error 1

    出错原因及解决过程:

    1、出错原因:在要编译链接的源文件 list_repo.cc 中缺少了一个需要引用的头文件 getload.h 的声明;

         解决过程:在要实现的源文件中添加所要用到的所有的头文件。在本例中添加 getload.h 的头文件后再次尝试编译,发现错误并没有消失,23333,好气呀,还以为解决的思路有问题。。。。。走了半天弯路,发现了下面的错误。

    2、出错原因:在 Makefile 文件的编辑时没有将关联引用的文件 getload.cc 添加上。。。。。好蠢啊。。。。。

         解决过程:

    LS_SRCS=list_repo.cc xxxxx.cc xxxxx.cc getload.cc xxxxx.cc xxxxx.cc 

        在 Makefile 文件中添加引用文件 getload.cc 后,再次编译终于通过,开心!!!!!

    g++ -o bin/list_repo list_repo.o xxxxxx.o xxxxx.o getload.o xxxxx.o xxxxx.o -O3 -Wall -L../xxxxx/lib -L../xxxxx/lib -lpthread

    参考文章:

    1、乌合之众:gcc编译时对’xxxx’未定义的引用问题   写的很详细;

    2、知乎问答:g++链接时报错:未定义的引用?     和我的问题不一样,是使用模块类时出现的问题。

  • 相关阅读:
    学习进度二
    课后感想2
    .NET 软件下面win10自动启动配置
    windows server 2012 ftp搭建
    ABP 切换mysql 数据库报错mysqlexception: incorrect string value: ‘xe7xaex80xe4xbdx93…’ for column display name
    .NET CORE 热更新,否则提示DLL文件在使用中
    .NETCore部署步骤
    解压版mysql安装步骤
    Asp.NET CORE安装部署
    PL/SQL 连接oracle步骤
  • 原文地址:https://www.cnblogs.com/sylar5/p/6701318.html
Copyright © 2020-2023  润新知