代码之家  ›  专栏  ›  技术社区  ›  Oberon311

链接器错误:未定义对函数的引用

  •  1
  • Oberon311  · 技术社区  · 6 年前

    当我试图编译代码时,我遇到了链接器错误。

    当我使用 g++ *.cpp -std=c++11 -o run 我得到以下错误:

    main.cpp:(.text+0x355): undefined reference to `Actions(mBoard&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::set<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::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)'
    collect2: error: ld returned 1 exit status
    

    我试着分别编译和链接所有文件,但都没有用。它不是成员函数,因此不是标签问题。我也试着使用 g++ -std=c++11 main.cpp mAI.cpp -o run 确保它实际上正在编译和链接这两个文件,但运气不好。

    真正让我抓狂的是,它不是在抱怨 Translate 以与Actions函数相同的方式声明和定义的函数。

    非常感谢您的帮助。

    市场关注度指数。水电站

    #ifndef MAI_HPP
    #define MAI_HPP
    
    #include <iostream>
    #include <set>
    #include <tuple>
    #include "mBoard.hpp"
    using namespace std;
    
    void Actions(mBoard const &state, string const playerColor, set<string> moveList);
    tuple<int, int> Translate(string index);
    
    #endif
    

    市场关注度指数。cpp公司

    #include "mAI.hpp"
    
    std::set<char> blackPieces = {'r', 'n', 'b', 'q', 'k', 'p'};
    std::set<char> whitePieces = {'R', 'N', 'B', 'Q', 'K', 'P'};
    
    void Actions(mBoard const &state, string const playerColor, set<string> moveList)
    {
        //Do some stuff
    }
    
    tuple<int, int> Translate(string index)
    {
        //Do different stuff
    }
    

    主要的

    #include "mAI.hpp"
    #include "mBoard.hpp"
    #include <set>
    #include <tuple>
    #include <string>
    #include <iostream>
    
    int main()
    {
    
      mBoard dasBoard;
      set<string> moveList;
      string color = "White";
    
      cout<<"TEST - Translate: f6 to file, rank: ";
      tuple<int, int> test;
      test = Translate("f6");
      cout << get<0>(test) << ", " << get<1>(test) << endl;
    
      Actions(dasBoard, color, moveList);
      return 0;
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Klaus    6 年前

    这听起来像是一个非常古老的gcc编译器。在早期版本的gcc和系统上安装的库的abi更改期间,这是一个问题。

    使用 -D_GLIBCXX_USE_CXX11_ABI=0 并重新编译所有可能有用的内容。

    另请参见本文档: https://gcc.gnu.org/onlinedocs/libstdc%2B%2B/manual/using_dual_abi.html

    顺便说一句: 我可以用gcc 7.3.1(fedora)编译并链接你的代码,没有任何错误。剪切并粘贴代码后,会出现一些未使用变量的警告,并且只在类上添加一个空的变量。所以我相信你的代码没有问题。

    从文档中:

    如果您收到关于未定义符号引用的链接器错误,这些符号涉及std::\u cxx11命名空间或标记[abi:cxx11]中的类型,则可能表示您正在尝试将使用不同值编译的对象文件链接到一起,以用于\u GLIBCXX\u USE cxx11\u abi宏。当链接到使用较旧版本的GCC编译的第三方库时,通常会发生这种情况。如果无法使用新的ABI重建第三方库,则需要使用旧的ABI重新编译代码。