2017-01-18 2 views
1

я столкнулся со следующей проблемой:Как повторно использовать классы C++ от одного проекта к другому без копирования

У меня есть проект, который содержит математические классы (.h и .cpp файлы). Я хочу использовать эти классы в другом проекте (не в том же решении), но я не могу.

В новом проекте я добавляю путь к файлам include моего математического проекта. Когда я пытаюсь # включить их, он работает, и я могу видеть мои классы, но, пытаясь использовать их, я получаю «Unresolved external». Я не создал .dll или .lib, поэтому я действительно не знаю, что вызывает это.

Если у вас есть предложения, я буду признателен.

спасибо, что заранее.

+7

«Я не создал .dll или .lib, поэтому я действительно не знаю, что вызывает это». Это не вызывает использование библиотеки. –

+0

Возможно, вам захочется создать отдельный проект библиотеки для общих частей, а затем использовать его в других проектах. –

+0

Я подозреваю, что все эти «нерешенные внешние» находятся в файлах реализации .cpp, которые вы никогда не добавляли в свой новый проект. И у вас была бы проблема с * идентичным * в вашем исходном проекте, если бы вы просто удалили файлы .cpp. Вы * можете * обмениваться исходными файлами по нескольким проектам, но это означает, что dll/lib, скорее всего, находится в меню, а не реплицирует скомпилированные единицы перевода по всему месту. – WhozCraig

ответ

2

Когда я пытаюсь #include им, что это работает, и я могу видеть мои классы, но при попытке использовать их я получаю «неразрешенный внешний». Я не создал .dll или .lib, поэтому я действительно не знаю, что вызывает это.

То, что Вы не создали библиотеку именно причина почему вы получите ошибку. Компиляции в вашем новом проекте («*.cpp файлов») включают заголовки для ваших классов и используют определения классов, но определения членов отсутствуют.

Например, предположим, что у вас есть файл с именем "c.h" в старом проекте:

#ifndef C_H 
#define C_H 

class C 
{ 
public: 
    C(); 
    void f(); 
}; 

#endif 

Некоторые *.cpp файл в новом проекте включает в себя заголовок и использует класс:

#include "somepath/oldproject/c.h" 

void someFunction() 
{ 
    C c; 
    c.f(); 
} 

Этот компилируется отлично, но это приведет к ошибкам компоновщика, поскольку определения C::C и C::f будут отсутствовать.

Теперь, чистое решение это, конечно, не добавление somepath/oldproject/c.cpp из старого проекта вашего нового проекта, хотя это было бы исправить ошибку компоновщика, но использовать подход библиотеки на основе. Превратите свои математические классы в проект библиотеки, назовем его «Math Utils», который создает файл *.lib (как вы, кажется, в Windows), например math-utils.lib. Добавьте путь include и release библиотеки к вашим глобальным путям include и library. Затем добавьте файл math-utils.lib в зависимости от компоновщика нового проекта.

И изменить код в новом проекте:

#include <math-utils/c.h> 

void someFunction() 
{ 
    C c; 
    c.f(); 
} 

Сделайте то же самое в старом проекте! Вы получите три разных проекта. Два прикладных проекта и один проект библиотеки, первые два в зависимости от последнего.

Создание собственных библиотек в первый раз может быть немного пугающим, но выгоды стоят проблемы.


См. Также The Linker Is not a Magical Program.

+0

Спасибо, святой, христианин! Я сделал небольшой тест и смог загрузить функции и использовать их с .lib. Я думал, что это будет похоже на включение GLM, где вам не нужна DLL или статическая библиотека, но это, вероятно, другой случай :) Еще раз большое спасибо! – Jigo

Смежные вопросы