2015-06-03 1 views
1

Я изучаю C++, но попал на плато, пытаясь создать библиотеку. Использование Visual Studio 2013, я получаю эту ошибку:Пытается создать библиотеку в C++. Проект тестирования не может найти реализацию объявленного конструктора?

Error 1 error LNK2019: unresolved external symbol "public: __thiscall Polynomial::Polynomial(void)" ([email protected]@[email protected]) referenced in function _main A:\Medier\Desktop\PolyLib\Test\Test.obj Test

TestProject в настоящее время сократить до этого:

#include "A:\Medier\Desktop\PolyLib\PolyLib\PolyLib.h" 

using namespace std; 

void main() 
{ 
    Polynomial poly; 
} 

Заголовочный файл библиотеки, PolyLib.h, выглядит следующим образом:

using namespace std; 

class Polynomial { 

private: 
    double* Coefficients; //Array of coefficients - Pointer type. 
    int Degree; //The highest exponent of the polynomial 

public: 
    Polynomial(); //Default constructor - Creates the trivial polynomial 0. 
    Polynomial(int degree, double coefficients[]); //Constructor for specific polynomials 

Наконец, в библиотеке есть файл CPP, PolyLib.cpp, обеспечивающий реализацию для файла заголовка. Похоже, это:

#include "PolyLib.h" 

using namespace std; 

Polynomial::Polynomial() { 
    Degree = 0; 
    Coefficients = new double[Degree + 1]; 
    Coefficients[0] = 0; 
} 

Polynomial::Polynomial(int degree, double coefficients[]) : Degree(degree), Coefficients(coefficients) { 
    int i = 0; 

}

Я понимаю, что мой тестовый проект выглядит файл PolyLib.h, чтобы увидеть, что материал доступен. И я понимаю, что ошибка говорит, что не может найти фактическую реализацию пустого конструктора для Polynomial. Таким образом, я делаю вывод, что файл PolyLib.cpp не используется.

Может ли кто-нибудь сказать мне, куда я иду отсюда?

+1

Размещение 'using namespace std;' - это файлы заголовков, это ** плохая ** идея. Это не источник вашей проблемы, но вы все равно не должны этого делать. –

+0

Возможно, вы правы, но могу ли я спросить, почему? ** Редактировать ** - у Google было много ответов, неважно. :) – Treeline

+1

См. Http://stackoverflow.com/questions/14575799/using-namespace-std-in-a-header-file –

ответ

1

Возможно создание всех ваших .cpps в одном проекте, который наиболее часто встречается для новичков. Однако из тегов вопроса и формулировки я предполагаю, что вы хотите создать и связать статический lib, который также можно сделать довольно просто.

Я только что построил пример правильно настроенной статической связи lib + exe в одном проекте VS2013: Dropbox link, для объяснения этого вопроса.

Основой является то, что вам нужны два проекта: проект lib (выводит статический .lib-файл) и exe-проект (выводит файл .exe). Проект .exe содержит функцию main() и может включать заголовки и ссылку на .lib.

Достопримечательности в MyExe - это то, что я добавил $(SolutionDir)\LibExample\Inc в путь включения, чтобы включить мой заголовок (header.h), и я добавил $(SolutionDir)\$(Configuration) в путь библиотеки для библиотек. Вы можете найти их, щелкнув правой кнопкой мыши проект, перейдите к свойствам, и все это находится под «VC++ Directories».

Отличный совет по определению пути, необходимого для поиска вашей библиотеки, - это просто создать lib. На самом деле это говорит вам о том, что текст «Output-> Build» находится там, где находится только что построенный файл. Это путь, который вам нужен.$(SolutionDir)\$(Configuration) - это «макросъемка» этого пути. Я рекомендую использовать макросы, чтобы вы могли легко перемещать каталог проекта на другой путь или компьютер.

Я также добавил LibExample.lib; в «дополнительные зависимости» в настройках компоновщика \ ввода. Это ключевой шаг для возможности связать lib. Не делать этого приведет к неразрешенному внешнему символу, точно так же, как вы видите.

Я также установил зависимость между MyExe и LibExample (вы щелкните правой кнопкой мыши проект, Build Dependencies-> Project Dependencies). Это важно, так что вы можете перестроить все решение, не опасаясь ссылки на более старую версию lib. С учетом зависимости, он всегда будет создавать lib сначала, а затем exe.

+0

Ты мужчина. :) Я наконец понял настройку. – Treeline

1

Если вы пытаетесь построить Polylib.h и Polylib.cpp в бинарном, таких как Polylib.lib, то вам нужно иметь отдельный проект, который имеет эти исходные файлы и создает статическую библиотеку. Затем вам нужен ваш проект, чтобы связать эту библиотеку Polylib, чтобы он мог связать код с вашим двоичным кодом. Если вы просто хотите иметь один проект и строите только один бинарный файл, вам необходимо переместить в проект проект Polylib.h и Polylib.cpp и собрать все это вместе. Другое дело, что использование абсолютных путей для включения заголовков - плохая идея. Вы хотите включить заголовки, используя относительные пути, а затем использовать настройки проекта, чтобы указать, где расположены заголовки. Например, если это локально для проекта, используйте #include "header". Если он не является локальным для проекта, используйте #include <libraryfolder/header>, а затем сообщите проекту, где папка библиотеки находится в настройке «включить каталоги».