我的配置类的未解析外部符号 (C++)

Unresolved External Symbol with my Config Class (C++)

提问人:Herith12 提问时间:2/17/2015 最后编辑:Herith12 更新时间:2/17/2015 访问量:186

问:

我看了很多关于这个话题的帖子,但没有一个有帮助。我仍然无法弄清楚我做错了什么。请帮忙!

我收到此错误:

main.obj:-1: error: LNK2019: unresolved external symbol "public: __thiscall Config::Config(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0Config@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main

这是我所拥有的代码。我从代码中剥离了所有内容,试图弄清楚这一点;这非常简单。

我的 Config.h 文件

#ifndef CONFIG_H
#define CONFIG_H

#include <string>

class Config{
public:
     Config(std::string file_name);
};

#endif

这是我的 Config.cpp 文件

//Config class
#include "Config.h"
#include <string>

Config::Config(std::string file_name){
    //Do stuff
}

这是我尝试使用它的地方

Config c("test");

即使经过一个小时阅读文章和线程,我也无法弄清楚这一点。

C++ qt-creator 未解析外部

评论

0赞 Baum mit Augen 2/17/2015
什么是未定义的引用/未解析的外部符号错误以及如何修复它?
0赞 Baum mit Augen 2/17/2015
您显然没有链接到 Config.cpp 编译到的任何内容,或者一开始就无法编译它。
0赞 The Dark 2/17/2015
你使用的是 Visual Studio 吗?(根据错误代码,您至少使用的是 MSVC 编译器)。项目中是否存在 Config.cpp?它应该位于解决方案资源管理器的“源文件”部分中
0赞 Herith12 2/17/2015
我正在使用Qt程序,头文件位于头文件夹下(在Qt中),.cpp文件在源下(在Qt中)。至于副本,我知道它是副本,但没有其他文章或线程帮助我。我花了一个多小时查看信息,但没有任何帮助。另外,鲍姆,你能澄清一下你的意思吗?我不太明白。
0赞 Baum mit Augen 2/17/2015
@Herith12 在我链接的骗局中已经详细解释了。此外,“超过一个小时”并不是花在问题上的时间。

答:

2赞 paxdiablo 2/17/2015 #1

确保您确实在文件(或其等效对象文件)中进行了链接。如果您只执行文件。您将收到这样的“未解决”错误。Config.cpp

例如,对于以下文件:

Config.h :
    #ifndef CONFIG_H
    #define CONFIG_H
    #include <string>
        class Config{
        public:
            Config(std::string file_name);
        };
    #endif

Config.cpp:
    #include "Config.h"
    #include <string>
    Config::Config(std::string file_name){}

Main.cpp:
    using namespace std;
    #include "Config.h"
    int main() {
        Config c("test");
        return 0;
    }

编译和链接这两部作品:

pax> g++ -o Main Main.cpp Config.cpp

但是不这样做会导致错误:Config.cpp

pax> g++ -o Main Main.cpp
     /tmp/cc8GYPy2.o: In function `main':
       Main.cpp:(.text+0x42): undefined reference to 
         `Config::Config(std::string)'
     collect2: error: ld returned 1 exit status

当您使用命令行编译器时,这很容易辨别,因为从命令行中可以立即看出发生了什么。

在 IDE 中,它可能没有那么简单,但通常归结为确保 CPP 源文件是项目的一部分并将被构建。

测试它是否是:从主 CPP 文件中注释掉当前有问题的行,并将其添加到:Config.cpp

int main() { return 0;}

如果它实际上正在构建中,您应该会看到一个错误,抱怨重复的符号。main

评论

0赞 Herith12 2/17/2015
所以你是说我没有编译这两个文件?
0赞 paxdiablo 2/17/2015
@Herith12,不行,因为我无法从这里访问您的系统。我要说的是,您应该检查/确保将这两个文件编译并链接在一起。据我所知,这可能是QtCreator中的一个错误,或者有人用恶作剧程序替换了你的编译器,或者你一直在参与非法物质。所有这些都比我假设的可能性要小,但我的确定性水平还没有完全达到 100% :-)