链接器未解析内联函数的外部符号

时间:2016-05-24 14:54:10

标签: c++

我正在使用Visual Studio 2015开发C ++解决方案。

我有一个带有此声明的cpp源文件和头文件hpp。

部首:

#ifndef MyLib__FREEFUNCTIONS__INCLUDE__
#define MyLib__FREEFUNCTIONS__INCLUDE__

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

// Check if 'str' is null, empty or consists only of white-space characters. 
inline bool IsNullOrWhiteSpace(string str);

// More functions
[ ... ]

#endif

和源代码:

#include "FreeFunctions.h"

inline bool IsNullOrWhiteSpace(string str)
{
    return (str.empty() || (str.find_first_not_of(' ') == string::npos));
}

我在课堂上使用这个功能:

#include "ConvertToOwnFormat.h"
#include "FreeFunctions.h"

ConvertToOwnFormat::ConvertToOwnFormat()
{
}


ConvertToOwnFormat::~ConvertToOwnFormat()
{
}

vector<Entry> ConvertToOwnFormat::ReadCatalogue(string path)
{
    if (!IsNullOrWhiteSpace(path)
    {
        [ ... ]
    }
}

我在ConvertToOwnFormat::ReadCatalogue中收到以下错误:

  

错误LNK2019外部符号“bool __cdecl IsNullOrWhiteSpace(类   的std :: basic_string的,类   std :: allocator&gt;)“   (?IsNullOrWhiteSpace @@ YA_NV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ Z)   函数“public:class std :: vector&gt; __cdecl”引用的未解析   ConvertToOwnFormat :: ReadCatalogue(class std :: basic_string,class std :: allocator&gt;)“   (?ReadCatalogue @ @@ ConvertToOwnFormat QEAA?AV?$矢量@ @@距离Ventry V'$分配器@距离Ventry @@@ STD @@@ STD @@ V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V· $ allocator @ D @ 2 @@ 3 @@ Z)MyProjectLib D:\ Fuentes \ Repos \ MyProject \ MyProjectLibConsoleTest \ ConsoleMyProjectLib \ Lib.lib(ConvertToOwnFormat.obj)1

1 个答案:

答案 0 :(得分:4)

您必须在标头中放置方法声明。 inline告诉编译器它应该用函数的核心替换函数的调用。因此,它需要在编译时为每个使用它的编译单元

#ifndef MyLib__FREEFUNCTIONS__INCLUDE__
#define MyLib__FREEFUNCTIONS__INCLUDE__

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

// Check if 'str' is null, empty or consists only of white-space characters. 
inline bool IsNullOrWhiteSpace(std::string str)
{
    return (str.empty() || (str.find_first_not_of(' ') == std::string::npos));
}

// Others functions, prototype, ...

#endif

或删除源文件和头文件中的inline

它完全脱离主题,但从不在标题中放置using namespace:标题应该提供一些内容,但不应强加类似命名空间的内容。另请参阅"using namespace" in c++ headers