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

Linker Error: Undefined Reference to Function

提问人:Oberon311 提问时间:3/5/2018 更新时间:3/5/2018 访问量:2275

问:

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

当我使用编译时,出现以下错误: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

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

任何帮助都非常感谢。

mAI.hpp(英语:mAI.hpp)

#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

mAI.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;
}
C++11 G++ 链接器错误 未定义引用

评论

0赞 Oberon311 3/5/2018
我把它放进去,得到同样的链接器错误......
0赞 Oberon311 3/5/2018
完成和完成,没有变化。我可以看到主要但出于好奇,为什么在 mAI.cpp 中?包含 .hpp 后,它不会自动包含那里吗?
0赞 Mike Kinghan 3/5/2018
需要最少的可重复示例。顺便说一句,看看为什么“使用命名空间标准”被认为是不好的做法?

答:

2赞 Klaus 3/5/2018 #1

这听起来像是一个非常古老的 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 ) 编译和链接您的代码而不会出现任何错误。剪切和粘贴代码后,一些未使用的 var 警告,并且只添加一个空的 aBoard 类。所以我相信你的代码没有问题。

从文档中:

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