0 / 0 / 0
Регистрация: 18.05.2016
Сообщений: 14

Ошибки линковщика при сборке

13.06.2016, 02:50. Показов 1066. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делал по примеру, а нифига не работает...
Вот код:
funcs.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "lagrange.h"
 
void lagrange_start()
{
    lagrange first;
    /**
    * Создаём объект, т.е. идём в lagrange.cpp в конструктор
    **/
    first.show();
    /**
    * Необязательная строчка - смотрим, правильно ли мы ввели точки
    **/
    double res; 
    string quit;
    /**
    * В res положим результат, т.е. значение, которое получим с
    * помощью полинома. exit - туда мы введём "y" в конце программы,
    * если захотим повторить вычисления.
    **/
    cout << "\nWanna calc another x, mm-m? >> ";
    /**
    * После того, как мы ввели точки, нас спрашивают, где теперь
    * хотим посчитать значение полинома (естественно надо вводить
    * такой икс, какой мы не вводили при заполнении в начале
    **/
    double xtocalc;
    cin >> xtocalc;
    /** вводим **/
    res = first.polynomial(xtocalc);
    /** считаем, соответствующий ему игрик (в lagrange.cpp) **/
    cout << "\nf(x)=" << res << endl;
    /** и печатаем **/
    cout << "\nExit? [Y] ";
    cin >> quit;
    if ((quit == "Y") || (quit == "y"))
        exit(EXIT_SUCCESS);
    /** функция и константа EXIT_SUCCESS прописаны в stdlib.h **/
    else
    {
        first.~lagrange();
        lagrange_start();
    }
    /**
    * если ввели любую другую букву/цифру/слово, то программа начнётся
    * с начала, но с заполнения. Баннер из main() не повторится.
    **/
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using namespace std;
#include <iostream>
#include <string>
#include <math.h>
#include <stdlib.h>
//для exit(EXIT_SUCCES);
#include "lagrange.cpp"
#include "funcs.cpp"
#include "lagrange.h"
//его мы сделали и подключили,
//дабы облегчить main()
 
int main()
{
    cout << "\nClass Lagrange\n";
    cout << "Input values: X[n] and Y[n] - The Table\n";
    cout << "Then choose another x to calc f(x)\n";
    //а-ля баннер
 
    lagrange_start();
    //начинаем (см. funcs.cpp)
}
lagrange.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "lagrange.h"
/**
* Как полагается, в хедере только объявляем
* а в .cpp уже расписываем.
**/
 
lagrange::lagrange()
//конструктор
{
    int n1;
    cout << "\nCreating an object...\n\n";
    /**
    * Вводим количество точек, которые введём
    **/
    cout << "Number of dots: ";
    for (;;)
    {
        cin >> n1;
        if (n1 < 1)
            /**
            * Для одной точки Лагранж с математической т.зр. ещё работает,
            * а вот для 0 или меньше - уже нет, поэтому следует проверять.
            * Тем более, что для 0 или меньше ячеек память не выделяеца =)
            **/
            cout << "N must be more than 1, enter it again: ";
        else break;
    }
    cout << endl;
    n = n1;
 
    x = new double[n];
    y = new double[n];
 
    for (int i = 0; i<n; i++)
        /**
        * Заполняем сразу парами, каждая пара - и есть координата точки,
        * например (0; 0), (1; 1), (1.5; 2.25) и т.д.
        **/
    {
        cout << "X[" << i + 1 << "]=";
        cin >> x[i];
        cout << "Y[" << i + 1 << "]=";
        cin >> y[i];
    }
}
 
lagrange::~lagrange()
/**
* Использование в этой программе деконструктора совсем не обязательно
* поэтому его можно было бы вообще не объявлять и не писать, ни в
* lagrange.h, ни здесь.
**/
{
    delete[] x; delete[] y;
}
 
void lagrange::show()
/**
* Метод для вывода на экран тех точек, которые мы ввели, заполняя
* данный объект.
* **/
{
    cout << "\nThe Table:\n\n";
    for (int i = 0; i<n; i++)
    {
        cout << x[i] << "\t";
        cout << y[i] << "\n";
    }
}
 
double lagrange::polynomial(double argx)
/**
* Сам полином, реализация формулы, которую можно найти где угодно.
**/
{
    double c, s = 0;
    for (int i = 0; i<n; i++)
    {
        c = 1;
        for (int j = 0; j<n; j++)
            if (i != j)
                c *= (argx - x[j]) / (x[i] - x[j]);
        s += c*y[i];
    }
    return s;
}
lagrange.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* Суть лагранжа в следующем:
* задаём массив из иксов и игриков, каждая пара - это точка
* допустим, (0, 0), (1, 1), (2, 4). Такими точками мы "загадали"
* параболу. Далее нас спрашивают "Где посчитать значение функции?",
* и мы вводим, например "1.5" (вводить желательно между 0 и 2).
*
* Компьютер ничего не знал, мы не говорили ему, что мы загадали,
* но он правильно отвечает нам - значение игрика в иксе равном 1.5
* равно 2.25. В этом и заключается смысл программы и математический
* смысл полинома (многочлена) Лагранжа. Он выдаёт такой полином, что
* график его функции проходит через все точки, которые мы ввели.
*
* Конечно, можно ввести такие точки, что он не угадает, что мы имели
* в виду. Особенно, если вводилось большое количество точек.
**/
#include <string.h>
#include <iostream>
using namespace std;
 
class lagrange
{
    double *x, *y;
    //будущие массивы
    int n;
    //количество точек (см. конструктор в lagrange.cpp)
 
public:
    lagrange();
    //конструктор (кроме чем как по-умолчанию не используем)
    ~lagrange(void);
    //деконструктор (можно и не использовать вообще)
    void show(void);
    //распечатка созданного объекта
    double polynomial(double);
    //вычисление полинома по формуле
};
Добавлено через 42 минуты
Все, разобрался, теперь другая трабла

Добавлено через 1 минуту
Code
1
2
3
4
5
6
1>main.obj : error LNK2005: "public: __thiscall lagrange::lagrange(void)" (??0lagrange@@QAE@XZ) already defined in lagrange.obj
1>main.obj : error LNK2005: "public: __thiscall lagrange::~lagrange(void)" (??1lagrange@@QAE@XZ) already defined in lagrange.obj
1>main.obj : error LNK2005: "void __cdecl lagrange_start(void)" (?lagrange_start@@YAXXZ) already defined in funcs.obj
1>main.obj : error LNK2005: "public: double __thiscall lagrange::polynomial(double)" (?polynomial@lagrange@@QAENN@Z) already defined in lagrange.obj
1>main.obj : error LNK2005: "public: void __thiscall lagrange::show(void)" (?show@lagrange@@QAEXXZ) already defined in lagrange.obj
1>c:\users\наташа\documents\visual studio 2015\Projects\lagrange\Debug\lagrange.exe : fatal error LNK1169: one or more multiply defined symbols found
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.06.2016, 02:50
Ответы с готовыми решениями:

Ошибки линковщика при использовании сокетов
Доброго времени суток! При попытки скомпилировать код, линковшик выдает ошибки. Хотелось бы узнать: Почему и как это убрать? Код: ...

Моделирование океана - ошибки линковщика при компиляции
Набрал огромный код из книги &quot;C++ изнутри&quot;, при компиляции получаю: Как исправить? Проект VS: http://rghost.ru/41456754

Ошибки при сборке любой программы
Почему при построении любой программы возникают одни и те же ошибки: 1&gt;------ Построение начато: проект: ConsoleApplication6,...

2
 Аватар для omninamed
11 / 11 / 4
Регистрация: 18.06.2013
Сообщений: 29
20.07.2016, 10:34
Попробуй добавить в самом начале .h файла директиву
C++
1
#pragma once
У тебя несколько .cpp файлов включающих в себя основной .h файл, линкер пытается несколько раз обработать одно и то же.

И никогда не делай так
C++
1
#include "my_file.cpp"
файлы реализации не нужно никуда подключать.
0
Заблокирован
22.07.2016, 23:10
Цитата Сообщение от Andrey165 Посмотреть сообщение
first.~lagrange();
- вот ты извини конечно, но "какой (не знаю как написать цензурно) дергает деструктор как функцию"?!, убери сейчас же!Компилятор автоматически добавляет вызов деструктров, если ты его дёрнул, то можешь выгрести непоправимых проблем. Твои ошибки убираются этим
Цитата Сообщение от omninamed Посмотреть сообщение
#pragma once
в начале каждого хедера твоего проекта, никаких #ifdef не надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2016, 23:10
Помогаю со студенческими работами здесь

Ошибки линковщика
Люди добрые, подскажите, как быть или дайте ссылку на статью о том, как работает линковщик.. Есть один главный хэдер, подключащий всё...

Code::Blocks, ошибки при сборке проекта, использующего OpenGL
Всем привет! У меня вот такие ошибки: ||=== Build: Debug in test6 (compiler: GNU GCC Compiler) ===| obj\Debug\test6Main.o||In...

Непонятные ошибки линковщика
В общем пытаюсь прикрутить работу с пост запросами но появляются ошибки не могу понять как всё это исправить

Объясните доступно и просто возможные причины возникновения ошибки линковщика - LNK2005
Объясните доступно и просто возможные причины возникновения ошибки линковщика - LNK2005.

Ошибки компиляции "unresolved external symbol" при сборке проекта с dlib
собираю решение, выдает кучу ошибок, хотя сам код был скопирован из примеров к библиотеке dlib на официальном сайте, по идее ошибок быть не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru