链接器未定义符号错误

Linker undefined symbols error

本文关键字:错误 符号 未定义 链接      更新时间:2023-10-16

我的两个文件userinterface.h

#ifndef USERINTERFACE_H
#define USERINTERFACE_H
#include <string>
#include "vocabcollection.h"
namespace user_interface
{
//Finds a file
//
//Returns when user selects a file
std::string findFile();
//more comments followed by functions
}
#endif

和userinterface.cpp,

#include "userinterface.h"
using namespace std;
using namespace user_interface;
string findFile()
{
    return "./";
}
//more placeholder implementations of such functions; void functions have nothing within
//the brackets

从链接器中给了我大量的错误:

Undefined symbols for architecture x86_64:
make: Leaving directory `longdirectorypath'
  "user_interface::showTestResults(int, int)", referenced from:
      vocabCollection::test()      in vocabcollection.o
  "user_interface::get(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      addNewCollection()     in mainlogic.o
      loadNewCollection()     in mainlogic.o
  "user_interface::findFile()", referenced from:
      loadNewCollection()     in mainlogic.o
  "user_interface::displayMainMenu(std::vector<vocabCollection, std::allocator<vocabCollection> >)", referenced from:
      mainlogic()    in mainlogic.o
  "user_interface::getUserAction()", referenced from:
      mainlogic()    in mainlogic.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [cheapassVocab.app/Contents/MacOS/cheapassVocab] Error 1
The process "/usr/bin/make" exited with code 2.
Error while building project cheapassVocab (target: Desktop)
When executing build step 'Make'

这是怎么回事?

在头文件中,在命名空间user_interface中声明函数findFile。在cpp文件中定义了free函数 findFile。是的,你是using namespace user_interface,但是编译器不知道那里定义的findFile属于namespace user_interface。所有这些的结果是您已经声明了user_interface::findFile并定义了::findFile。当您调用user_interface::findFile时,链接器找不到它,因为只有自由函数findFile

轻松解决- cpp文件:

#include "userinterface.h"
using namespace std;
namespace user_interface
{
    string findFile()
    {
        return "./";
    }
}

你不能这样实现findFile;它必须放在命名空间中:

namespace user_interface
{
    string findFile()
    {
        return "./";
    }
}
or:
string user_interface::findFile()
{
    return "./";
}

using指令仅用于查找,而不是用于定义-想象using namespace std;将对您的所有函数定义做什么!

您在错误的命名空间中定义了findFile。

std::string user_interface::findFile()
{
    return "./";
}

namespace user_interface
{
    std::string findFile()
    {
        return "./";
    }
}

using不影响名称的定义位置,它只影响名称的查找方式。