Змінюй хід війни! Допомагай ЗСУ!

Ошибки линковки, прошу помощи

🔴 21:30 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 23.09.2008
Повідом.: 851
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #1
Ошибки линковки, прошу помощи

Ситуация следующая - записался на online курсы INTUIT по теме "Программирование в visual studio". В последней лекции есть пример - построение интерполяционного полинома по методу Лагранжа. Приложение считывает точки и по ним строит полином. Для операций с полиномами они выслали готовый .h и .cpp файл, где описан шаблонный класс полиномов. Для этого класса переопределены операторы =, +, -, *, (). Проблема в том, что при использовании этих операторов в программе (программа не моя, тоже оттуда) выскакивают ошибки линковки вида:

error LNK2019: unresolved external symbol

гугл не дал мне нужной инфы, я бьюсь уже второй день, по всей видимости нужно задать какие то настройки проекта либо подключить какие то библиотеки. Если у кого есть чуть свободного времени, просто запустите у себя проект, может у меня просто студия не хавает или линкер переустановить нужно (я пока не знаю как это сделать).

Проект во вложенном файле, он недособран т.е. компилится, но не запускается, заранее спасибо всем, кто откликнется.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #2
Какой именно внешний символ не виден? Он должен писать что-то вроде такого: Unresolved external symbol: имя_символа
PS: Судя по namespace вы работаете в VC2005, у меня его нет, поэтому не могу сама посмотреть, напишите:(

Еше: Если при компиляции этого проекта у вас генерируется файл GP.lib - вы должны его включить в список используемых внешних библиотек вашего проекта, на вкладке "Linker".
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #3
Ругается на операторы

error LNK2019: unresolved external symbol "public: class Polinom<double> __thiscall Polinom<double>::operator+(class Polinom<double>)" (??H?$Polinom*N**QAE?AV0*V0**Z) referenced in function "public: bool __thiscall CGPDoc::BuildPolinom(void)" (?BuildPolinom*CGPDoc**QAE_NXZ)

Таких четыре ошибки, отличаются операторами: +, -, =, *. Оператор () почему то проходит.

Да, как проверить должен ли генерироваться GP.lib или нет и где он добавляется.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #4
Да, скорее всего придётся либо так как вы предлагаете, либо заменить их функциями, благо используются они нечасто.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #5
Вот лажа, сообщение смылось...:(
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #6
та что то не так с форумом, у меня на ветке "работа " up не проходит, а добавляется к старому сообщению, добавленному вчера утром ))) и топик висит где висел.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #7
error LNK2019: unresolved external symbol "public: class Polinom<double> __thiscall Polinom<double>::operator+(class Polinom<double>)" (??H?$Polinom*N**QAE?AV0*V0**Z) referenced in function "public: bool __thiscall CGPDoc::BuildPolinom(void)" (?BuildPolinom*CGPDoc**QAE_NXZ)
Вот, похоже, что у вас где-от в секции public объявлены не только методы класса Polinom, но и сам класс Polinom тоже public.
Да, как проверить должен ли генерироваться GP.lib или нет и где он добавляется.
Не, это он сам при компиляции генерит файл библиотеки, но в вашем случае он таки и не должен создаваться - вы же не в виде dll этот модуль делаете.
PS: Просто у меня привычка как что - сразу проверять, подключены ли в проект файлы .lib - я часто с dll-библиотеками работаю.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #8
Нет, класс Polinom - чистый класс, не наследованный, создан с нуля. В нём по сути элемент типа vector и эти операторы, всё public. Просто какой-то он сложный - сам шаблонный, vector сам по себе шаблонный и операторы тоже.

Вот текст класса

#include <vector>
using namespace std;
template <class A> class Polinom
{
public:
vector<A> Pol; //a0 + a1*x + a2*x^2 + ... + an*x^n
public:
Polinom(){Pol.resize(1); Pol[0] = 0;}
Polinom(A a){Pol.resize(1); Pol[0] = a;}
Polinom(int n, A *koef){Pol.resize(n); for(int i = 0; i < n; i++) Pol = koef;}
Polinom(const Polinom& initPol){Pol = initPol.Pol;}
Polinom<A> operator - ();
Polinom<A> operator + (Polinom<A>);
Polinom<A> operator - (Polinom<A>);
Polinom<A> operator * (Polinom<A>);
Polinom<A> operator = (Polinom<A>);
bool operator == (Polinom<A>);
A operator () (A arg);
};

Учитывая, что файл скачан с сайта INTUIT вероятно он должен работать.

Да попробовал поменять операторы на plus minus, не прокатило, выдал 60 ошибок, просто поменял , скажем, "+" на "plus".
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #9
Попробуйте убрать вторую декларацию паблик:незнаю:
PS: А может как раз нерабочий софт, отлаженный сторонним программистом входит в процесс дистанционного обучения в intuit.ru? :D
PSPS: Заглянет сюда Sergeime - он точно знает, подскажет.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #10
А может как раз нерабочий софт, отлаженный сторонним программистом входит в процесс дистанционного обучения в intuit.ru?

Мелкие подвохи у них встречались и раньше, но там как то быстрее справлялся
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #11
По мере роста уровня растут и сложности:)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #12
Ошибка в линковке из-за того, что реализуя шаблонные методы в cpp их нужно либо явно экспортировать через ключевое слово export, либо реализовывать их в хидере или отдельном .inl файле, например так сделан стл.
Исправленный проект в аттаче, проверил, как минимум все собирается, работоспособность не проверял :)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #13
Да, всё оказалось просто, но на поверхности не лежит.
Огромное спасибо Blackdealer за помощь и Tempory Mea за участие.
 
Назад
Зверху Знизу