求助!无法解析外部命令.....被引用 错误

时间:2022-09-02 19:46:18
小弟把一个类的的声明放在了头文件中,实现部分放在了一个cpp中,在main()中使用该类,就出现无法解析的外部符号错误。
可是,如果把类实现部分直接放在main().cpp的下面实现,就顺利通过编译。 这是什么原因,小弟搞了半天也不明所以。
请解惑!谢谢。
使用的是VC2005,还有,我建立了空工程,直接把源文件导入工程,同样出现这个错误,请各位大大帮忙。

14 个解决方案

#1


因为那个cpp文件,你没有加入工程,没有编译。

#2


所有的.h和.cpp的文件都要放到这个工程一起编译

#3


确定你的文件都导入了工程

然后在用类的时候,使用#include"xxx.h" 包含其头文件

#4


谢谢楼上的回答,其实我已经导入了cpp文件了,因为,我是根据向导添加的源文件写上去的,资源视图中也有这个源文件。 我试验了一下,如果把类的实现部分同时在给类的cpp和main的cpp中同时存在,就会引起重复定义错误,也说明了这个源文件确实在工程中。就是不知道什么原因。

#5


另外你建立的是控制台还是?

#6


是控制台

#7


引用 4 楼 yanjingxiong203512 的回复:
谢谢楼上的回答,其实我已经导入了cpp文件了,因为,我是根据向导添加的源文件写上去的,资源视图中也有这个源文件。 我试验了一下,如果把类的实现部分同时在给类的cpp和main的cpp中同时存在,就会引起重复定义错误,也说明了这个源文件确实在工程中。就是不知道什么原因。

把出错信息帖出来吧。

#8


谢谢楼上。

正在链接...
05_简单文本查询系统.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall zhangji::TextQury::read_file(class std::basic_ifstream<char,struct std::char_traits<char> > &)" (?read_file@TextQury@zhangji@@QAEXAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z),该符号在函数 _wmain 中被引用
05_简单文本查询系统.obj : error LNK2019: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall zhangji::TextQury::text_line(unsigned int)const " (?text_line@TextQury@zhangji@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@I@Z),该符号在函数 "void __cdecl display(class zhangji::TextQury &,class std::set<unsigned int,struct std::less<unsigned int>,class std::allocator<unsigned int> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?display@@YAXAAVTextQury@zhangji@@V?$set@IU?$less@I@std@@V?$allocator@I@2@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@4@@Z) 中被引用
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\05_简单文本查询系统\Debug\05_简单文本查询系统.exe : fatal error LNK1120: 2 个无法解析的外部命令
生成日志保存在“file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\05_简单文本查询系统\05_简单文本查询系统\Debug\BuildLog.htm”
05_简单文本查询系统 - 3 个错误,1 个警告

#9


请帮小弟看一下,这是TextQury.h
#ifndef TEXT
#define TEXT
#include<sstream>
#include<fstream>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<string>

namespace zhangji{
class TextQury{
public:
typedef std::vector<std::string>::size_type line_no; //文本行数
inline void read_file(std::ifstream& is); 
std::set<line_no> run_query(const std::string& str)const;
inline std::string text_line(line_no) const;
private:
inline void store_file(std::ifstream&);                     //读取文本
void buld_map();                                     //创建map 
std::vector<std::string> lines_of_text;              //存储文本
std::map<std::string, std::set<line_no> > word_map;  //map成员
};
}
#endif

这是TextQuery.cpp
#include "stdafx.h"   //TextQury.h包含在stdafx.h内了
using namespace zhangji;
using namespace std;

inline void TextQury::store_file(std::ifstream& is)  //is对象需要绑定一个文件
{
string text;
while(getline(is,text))
lines_of_text.push_back(text);
}
void TextQury::buld_map()                   //创建map,建立单词与行的关联
{
for(int line=0; line<lines_of_text.size(); ++line)
{
istringstream linelineline(lines_of_text[line]);
string word;
while(linelineline>>word)
word_map[word].insert(line);
}
}
inline void TextQury::read_file(std::ifstream& is)
{store_file(is), buld_map();}
set<TextQury::line_no> TextQury::run_query(const string& str)const
{
map<string ,set<line_no> >::const_iterator it=word_map.find(str);
if(it==word_map.end()) return set<line_no>();
return it->second;   }
inline string TextQury::text_line(line_no iline) const
{
if(iline<lines_of_text.size())
return lines_of_text[iline];
}

这是MAIN().CPP
#include "stdafx.h"
using namespace zhangji;
using namespace std;
typedef set<TextQury::line_no> set_line;
void display(TextQury&,set_line,const string&);

int _tmain(int argc, _TCHAR* argv[])
{
TextQury tq;
ifstream ifile; 

ifile.open("../text.txt");       
if(!ifile)               //if error when open the file
{cout<<"open error";  return -1;}
    set_line line;
tq.read_file(ifile);     //read "text" and store the text into word_map
string s;
cout<<"plese inter a word for find(if you inter a 'quit',the application exit):\n";
while(cin>>s && s!="quit")
{
display(tq,line,s);
cout<<"plese inter a word for find(if you inter a 'quit',the application exit):\n";
}
return 0;
}
void display(TextQury& tq,set_line line,const string&s )
{
line=tq.run_query(s); 
set_line::iterator iter;
for(iter=line.begin(); iter!=line.end(); ++iter)
cout<<tq.text_line(*iter)<<endl;
}

#10


就是C++ PRIMER中的那个例子,可就是编译不通过。请帮小弟看下。

#11


我将他们放在同一个文件里,工作正常。
只能解释为:你的.cpp并没有加入工程中。

#include<sstream>
#include<fstream>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<string>

namespace zhangji
{
class TextQury
{
public:
    typedef std::vector<std::string>::size_type line_no; //文本行数
    inline void read_file(std::ifstream& is);
    std::set<line_no> run_query(const std::string& str)const;
    inline std::string text_line(line_no) const;
private:
    inline void store_file(std::ifstream&); //读取文本
    void buld_map(); //创建map
    std::vector<std::string> lines_of_text; //存储文本
    std::map<std::string, std::set<line_no> > word_map; //map成员
};
}

using namespace zhangji;
using namespace std;

inline void TextQury::store_file(std::ifstream& is) //is对象需要绑定一个文件
{
    string text;
    while (getline(is, text))
        lines_of_text.push_back(text);
}
void TextQury::buld_map() //创建map,建立单词与行的关联
{
    for (int line = 0; line < lines_of_text.size(); ++line)
    {
        istringstream linelineline(lines_of_text[line]);
        string word;
        while (linelineline >> word)
            word_map[word].insert(line);
    }
}
inline void TextQury::read_file(std::ifstream& is)
{store_file(is), buld_map();}
set<TextQury::line_no> TextQury::run_query(const string& str)const
{
    map<string , set<line_no> >::const_iterator it = word_map.find(str);
    if (it == word_map.end()) return set<line_no>();
    return it->second;
}
inline string TextQury::text_line(line_no iline) const
{
    if (iline < lines_of_text.size())
        return lines_of_text[iline];
}

using namespace zhangji;
using namespace std;
typedef set<TextQury::line_no> set_line;
void display(TextQury&, set_line, const string&);

int main()
{
    TextQury tq;
    ifstream ifile;

    ifile.open("../text.txt");
    if (!ifile) //if error when open the file
        {cout << "open error"; return -1;}
    set_line line;
    tq.read_file(ifile); //read "text" and store the text into word_map
    string s;
    cout << "plese inter a word for find(if you inter a 'quit',the application exit):\n";
    while (cin >> s && s != "quit")
    {
        display(tq, line, s);
        cout << "plese inter a word for find(if you inter a 'quit',the application exit):\n";
    }
    return 0;
}
void display(TextQury& tq, set_line line, const string& s)
{
    line = tq.run_query(s);
    set_line::iterator iter;
    for (iter = line.begin(); iter != line.end(); ++iter)
        cout << tq.text_line(*iter) << endl;
}

#12


谢谢楼上解答,我在找找原因。看是不是

#13


建立了空的控制台工程,把C++ PRIMER的源代码导入后,问题依旧。 是不是编译器设置的问题?

#14


我试下了一下这个方法:在头文件中加入这句话:#pragma comment(lib,"highgui210d.lib"),就可以正常运行了,可是我在项目中设置了lib文件的连接的啊,怎么还必须显示加入呢????

#1


因为那个cpp文件,你没有加入工程,没有编译。

#2


所有的.h和.cpp的文件都要放到这个工程一起编译

#3


确定你的文件都导入了工程

然后在用类的时候,使用#include"xxx.h" 包含其头文件

#4


谢谢楼上的回答,其实我已经导入了cpp文件了,因为,我是根据向导添加的源文件写上去的,资源视图中也有这个源文件。 我试验了一下,如果把类的实现部分同时在给类的cpp和main的cpp中同时存在,就会引起重复定义错误,也说明了这个源文件确实在工程中。就是不知道什么原因。

#5


另外你建立的是控制台还是?

#6


是控制台

#7


引用 4 楼 yanjingxiong203512 的回复:
谢谢楼上的回答,其实我已经导入了cpp文件了,因为,我是根据向导添加的源文件写上去的,资源视图中也有这个源文件。 我试验了一下,如果把类的实现部分同时在给类的cpp和main的cpp中同时存在,就会引起重复定义错误,也说明了这个源文件确实在工程中。就是不知道什么原因。

把出错信息帖出来吧。

#8


谢谢楼上。

正在链接...
05_简单文本查询系统.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall zhangji::TextQury::read_file(class std::basic_ifstream<char,struct std::char_traits<char> > &)" (?read_file@TextQury@zhangji@@QAEXAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z),该符号在函数 _wmain 中被引用
05_简单文本查询系统.obj : error LNK2019: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall zhangji::TextQury::text_line(unsigned int)const " (?text_line@TextQury@zhangji@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@I@Z),该符号在函数 "void __cdecl display(class zhangji::TextQury &,class std::set<unsigned int,struct std::less<unsigned int>,class std::allocator<unsigned int> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?display@@YAXAAVTextQury@zhangji@@V?$set@IU?$less@I@std@@V?$allocator@I@2@@std@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@4@@Z) 中被引用
C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\05_简单文本查询系统\Debug\05_简单文本查询系统.exe : fatal error LNK1120: 2 个无法解析的外部命令
生成日志保存在“file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\05_简单文本查询系统\05_简单文本查询系统\Debug\BuildLog.htm”
05_简单文本查询系统 - 3 个错误,1 个警告

#9


请帮小弟看一下,这是TextQury.h
#ifndef TEXT
#define TEXT
#include<sstream>
#include<fstream>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<string>

namespace zhangji{
class TextQury{
public:
typedef std::vector<std::string>::size_type line_no; //文本行数
inline void read_file(std::ifstream& is); 
std::set<line_no> run_query(const std::string& str)const;
inline std::string text_line(line_no) const;
private:
inline void store_file(std::ifstream&);                     //读取文本
void buld_map();                                     //创建map 
std::vector<std::string> lines_of_text;              //存储文本
std::map<std::string, std::set<line_no> > word_map;  //map成员
};
}
#endif

这是TextQuery.cpp
#include "stdafx.h"   //TextQury.h包含在stdafx.h内了
using namespace zhangji;
using namespace std;

inline void TextQury::store_file(std::ifstream& is)  //is对象需要绑定一个文件
{
string text;
while(getline(is,text))
lines_of_text.push_back(text);
}
void TextQury::buld_map()                   //创建map,建立单词与行的关联
{
for(int line=0; line<lines_of_text.size(); ++line)
{
istringstream linelineline(lines_of_text[line]);
string word;
while(linelineline>>word)
word_map[word].insert(line);
}
}
inline void TextQury::read_file(std::ifstream& is)
{store_file(is), buld_map();}
set<TextQury::line_no> TextQury::run_query(const string& str)const
{
map<string ,set<line_no> >::const_iterator it=word_map.find(str);
if(it==word_map.end()) return set<line_no>();
return it->second;   }
inline string TextQury::text_line(line_no iline) const
{
if(iline<lines_of_text.size())
return lines_of_text[iline];
}

这是MAIN().CPP
#include "stdafx.h"
using namespace zhangji;
using namespace std;
typedef set<TextQury::line_no> set_line;
void display(TextQury&,set_line,const string&);

int _tmain(int argc, _TCHAR* argv[])
{
TextQury tq;
ifstream ifile; 

ifile.open("../text.txt");       
if(!ifile)               //if error when open the file
{cout<<"open error";  return -1;}
    set_line line;
tq.read_file(ifile);     //read "text" and store the text into word_map
string s;
cout<<"plese inter a word for find(if you inter a 'quit',the application exit):\n";
while(cin>>s && s!="quit")
{
display(tq,line,s);
cout<<"plese inter a word for find(if you inter a 'quit',the application exit):\n";
}
return 0;
}
void display(TextQury& tq,set_line line,const string&s )
{
line=tq.run_query(s); 
set_line::iterator iter;
for(iter=line.begin(); iter!=line.end(); ++iter)
cout<<tq.text_line(*iter)<<endl;
}

#10


就是C++ PRIMER中的那个例子,可就是编译不通过。请帮小弟看下。

#11


我将他们放在同一个文件里,工作正常。
只能解释为:你的.cpp并没有加入工程中。

#include<sstream>
#include<fstream>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<string>

namespace zhangji
{
class TextQury
{
public:
    typedef std::vector<std::string>::size_type line_no; //文本行数
    inline void read_file(std::ifstream& is);
    std::set<line_no> run_query(const std::string& str)const;
    inline std::string text_line(line_no) const;
private:
    inline void store_file(std::ifstream&); //读取文本
    void buld_map(); //创建map
    std::vector<std::string> lines_of_text; //存储文本
    std::map<std::string, std::set<line_no> > word_map; //map成员
};
}

using namespace zhangji;
using namespace std;

inline void TextQury::store_file(std::ifstream& is) //is对象需要绑定一个文件
{
    string text;
    while (getline(is, text))
        lines_of_text.push_back(text);
}
void TextQury::buld_map() //创建map,建立单词与行的关联
{
    for (int line = 0; line < lines_of_text.size(); ++line)
    {
        istringstream linelineline(lines_of_text[line]);
        string word;
        while (linelineline >> word)
            word_map[word].insert(line);
    }
}
inline void TextQury::read_file(std::ifstream& is)
{store_file(is), buld_map();}
set<TextQury::line_no> TextQury::run_query(const string& str)const
{
    map<string , set<line_no> >::const_iterator it = word_map.find(str);
    if (it == word_map.end()) return set<line_no>();
    return it->second;
}
inline string TextQury::text_line(line_no iline) const
{
    if (iline < lines_of_text.size())
        return lines_of_text[iline];
}

using namespace zhangji;
using namespace std;
typedef set<TextQury::line_no> set_line;
void display(TextQury&, set_line, const string&);

int main()
{
    TextQury tq;
    ifstream ifile;

    ifile.open("../text.txt");
    if (!ifile) //if error when open the file
        {cout << "open error"; return -1;}
    set_line line;
    tq.read_file(ifile); //read "text" and store the text into word_map
    string s;
    cout << "plese inter a word for find(if you inter a 'quit',the application exit):\n";
    while (cin >> s && s != "quit")
    {
        display(tq, line, s);
        cout << "plese inter a word for find(if you inter a 'quit',the application exit):\n";
    }
    return 0;
}
void display(TextQury& tq, set_line line, const string& s)
{
    line = tq.run_query(s);
    set_line::iterator iter;
    for (iter = line.begin(); iter != line.end(); ++iter)
        cout << tq.text_line(*iter) << endl;
}

#12


谢谢楼上解答,我在找找原因。看是不是

#13


建立了空的控制台工程,把C++ PRIMER的源代码导入后,问题依旧。 是不是编译器设置的问题?

#14


我试下了一下这个方法:在头文件中加入这句话:#pragma comment(lib,"highgui210d.lib"),就可以正常运行了,可是我在项目中设置了lib文件的连接的啊,怎么还必须显示加入呢????