2015-02-17 2 views
1

Я рассмотрел столько потоков по этой теме, и ни один из них не помог. Я все еще не могу понять, что я делаю неправильно. Пожалуйста помоги!Неразрешенный внешний символ с моим классом конфигурации (C++)

Я получаю эту ошибку:

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> >)" ([email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) referenced in function _main 

и вот что у меня есть codewise. Я раздели все с кода, чтобы попытаться понять это; это очень просто.

Мой файл 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"); 

Я не могу понять это для жизни меня, даже после часа чтения статей и нитей.

+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная внешняя ошибка символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved- external-symbol-error-and-how-do-i-fix) –

+0

Вы, по-видимому, не связаны с тем, что Config.cpp компилирует или не скомпилирует его в первую очередь. –

+0

Вы используете Visual Studio? (Исходя из кода ошибки, вы, по крайней мере, используете компилятор MSVC). Есть Config.cpp в проекте? Он должен находиться в разделе «Исходные файлы» в обозревателе решений. –

ответ

2

Убедитесь, что вы действительно связываетесь в файле 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

+0

@ Herith12, нет, потому что я не могу получить доступ к вашей системе отсюда. Я говорю, что вы должны _check/обеспечить_, что вы компилируете и связываете оба файла. Насколько я знаю, это может быть ошибка в QtCreator, или кто-то заменил ваш компилятор на пробную программу или вы принимали участие в незаконных веществах. Все это менее вероятно, чем то, что я положил, но уровни уверенности не достигают 100% :-) – paxdiablo