Как исправить ошибку компоновки

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

Например, есть три файла:

1) BigInteger.h:

#ifndef CPPBIGINTEGER_BIGINTEGER_H
#define CPPBIGINTEGER_BIGINTEGER_H

#include <vector>
#include <iostream>
using std::vector;

typedef vector<int> v;

class BigInteger {
private:
    bool sign;
    v absVal;
public:
    BigInteger() {
        foo(*this);
    }
    friend void foo(BigInteger& a);
};
#endif //CPPBIGINTEGER_BIGINTEGER_H

2) foo.cpp:

#include "BigInteger.h"

void foo(BigInteger& a) {
    a.absVal = {1, 2, 3};
}

3) main.cpp:

#include "BigInteger.h"

int main() {
    BigInteger a;
    return 0;
}

Во время компиляции g++-5 main.cpp получаю такую ошибку:

Undefined symbols for architecture x86_64:
  "foo(BigInteger&)", referenced from:
      BigInteger::BigInteger() in ccL6wDIn.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

Но если функция foo определена сразу после класса в BigInteger.h, то все нормально компилируется. Как это исправить?

Подписывайтесь на мой telegram-канал. Сразу оговорюсь, что проектов у меня много, помощников нет, всем помочь физически и морально не смогу, прошу меня простить, если кому-то не ответил или отказал в помощи.

Отправить эту статью на мою почту

Разберемся с вами что такое толстый и тонкий клиент 1С, а также исправим ошибку – «Для того, чтобы редактировать схему компоновки, необходимо запустить конфигурацию в режиме толстого клиента».

Смотрите видео инструкцию по этой статьей на моём Ютуб-канале (отмотайте видео на 15 мин 18 сек):

ЛАЙФХАКИ 1С 8.3 Часть 2 ЧУДЕСА без программирования

Что такое толстый и тонкий клиент 1С, в чем разница?

Все старые конфигурации 1С на обычных формах, например, «1С Управление торговлей редакции 10.х», «1С Бухгалтерия редакции 2» или «1С Розница редакции 1», могут работать только в режиме толстого клиента 1С, это значит, что на компьютере пользователя, где исполняется и отображается программа 1С выполняются основные вычисления и алгоритмы программы, и если клиентский (пользовательский) компьютер не очень мощный и программа 1С достаточно сложная и тяжелая, то 1С может тормозить, будут долго формироваться отчеты, открываться справочники и документы и т.п.

Многое поменялось, когда появился режим тонкого клиента 1С. Появились так называемые Управляемые формы. Если говорить проще и использовать аналогии, то 1С в режиме тонкого клиента стала как веб-сайт в интернете. Вы же, например, когда открываете какой-нибудь веб-сайт через свой веб-браузер (Хром, Edge…), то вы просматриваете на своем экране компьютера уже готовый результат сформированной на сервере HTML-страницы, т.е. основная работа по вычислениям и выполнению алгоритмов была произведена на сервере где расположен веб-сайт, а вы получили уже готовый результат. В итоге ресурсы вашего клиентского (пользовательского) компьютера были задействованы по минимуму, и даже если у вас слабый компьютер, то тормозить он почти не будет, не считая вычислений на прорисовку данных на вашем экране, на это тоже нужно время процессора.

Если вернемся от веб-сайтов обратно к 1С, то режим тонкого клиента будет быстрее работать, но только в том случае, если у вас современная конфигурация 1С на управляемых формах, например, «1С Управление торговлей редакция 11.х», «1С Бухгалтерия редакция 3.х» или «1С Розница редакция 2.х», и не менее важно, ваша база данных 1С должна работать в режиме клиент-сервера, причем сервер 1С должен находится на отдельном мощном сервере (компьютере).

Так что если вы приобрели, к примеру, «1С Бухгалтерия редакция 3» и установили её локально на своем компьютере в файловом варианте, даже и в серверном варианте, где сервер 1С также установили на этом же компьютере, то разницы не будет в каком режиме вы работаете: в тонком клиенте или в толстом клиенте 1С. Точнее в таком случае, вам лучше работать в режиме толстого клиента 1С, потому, что тонкий клиент накладывает определенные ограничения в контекст доступности некоторых функций и методов.

Как исправить ошибку «Для того, чтобы редактировать схему компоновки, необходимо запустить конфигурацию в режиме толстого клиента»?

У меня эта ошибка возникла в конфигурации «1С Розница 2» когда я хотел в справочнике «Виды цен» отредактировать схему компоновки данных «Произвольный» при способе задания цены «Заполнять по данным ИБ».

Редактировать схему компоновки в режиме тонкий клиент 1С (2)

Далее открывается окно «Настройка схемы компоновки данных для вида цены» и нажимаем кнопку «Редактировать схему компоновки», и если база 1С запущена в режиме тонкого клиента, то мы увидим ошибку – «Для того, чтобы редактировать схему компоновки, необходимо запустить конфигурацию в режиме толстого клиента».

Для того, чтобы редактировать схему компоновки, необходимо запустить конфигурацию в режиме толстого клиента 1С (3)

Эта ошибка не только может появиться при редактировании схемы компоновки в видах цен в рознице, но и в других местах программы, где требуется работа программы 1С в режиме толстого клиента.

Запускаем 1С в режиме толстого клиента

Кликаем как обычно по ярлыку 1С чтобы открылось окно выбора баз 1С, далее выделяете нужную базу и нажимаете кнопку «Изменить».

Изменить настройки запуска базы 1С (4)

Нажимаем «Далее». И найдите раздел «Основной режим запуска», где выберите «Толстый клиент».

Основной режим запуска толстый клиент 1с (5)

Всё. Теперь запускаете 1С как обычно, и она у вас теперь будет работать в режиме толстого клиента. И тот функционал, который доступен только в режиме толстого клиента 1С должен работать без ошибок.

Смотрите видео инструкцию по этой статьей на моём Ютуб-канале (отмотайте видео на 15 мин 18 сек):

ЛАЙФХАКИ 1С 8.3 Часть 2 ЧУДЕСА без программирования

Благодарю Вас за внимание! :)

Подписывайтесь на мой YouTube-канал, там много интересных и бесплатных видеоуроков по 1С — https://youtube.com/c/ЮрийКозицынПрограммист1С

Обсудить статью на 1С форуме?

Читайте также

  • SSL сертификат бесплатно! Защити своё подключение к 1С через интернет
  • Лайфхаки 1С – чудеса с табличной частью документа!
  • Как выбрать компьютер для 1С?
  • Исправление ошибки печати двухмерного штрихкода PDF417 в 1С
  • История изменений в 1С Предприятие 8

Отладка, или debugging, — это поиск (локализация), анализ и устранение ошибок в программном обеспечении, которые были найдены во время тестирования.

Виды ошибок

Ошибки компиляции

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

В интерпретируемых языках (например Python) текст программы команда за командой переводится в машинный код и сразу исполняется. К моменту обнаружения ошибки часть программы уже может исполниться.

Ошибки компоновки

Ошибки связаны с разрешением внешних ссылок. Выявляет компоновщик (редактор связей) при объединении модулей программы. Простой пример — ситуация, когда требуется обращение к подпрограмме другого модуля, но при компоновке она не найдена. Ошибки также просто найти и устранить.

Ошибки выполнения (RUNTIME Error)

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

  • сообщение об ошибке, которую зафиксировали схемы контроля машинных команд. Это может быть переполнение разрядной сетки (когда старшие разряды результата операции не помещаются в выделенной области памяти), «деление на ноль», нарушение адресации и другие;
  • сообщение об ошибке, которую зафиксировала операционная система. Она же, как правило, и документирует ошибку. Это нарушение защиты памяти, отсутствие файла с заданным именем, попытка записи на устройство, защищенное от записи;
  • прекращение работы компьютера или зависание. Это и простые ошибки, которые не требуют перезагрузки компьютера, и более сложные, когда нужно выключать ПК;
  • получение результатов, которые отличаются от ожидаемых. Программа работает стабильно, но выдает некорректный результат, который пользователь воспринимает за истину.

Ошибки выполнения можно разделить на три большие группы.

Ошибки определения данных или неверное определение исходных данных. Они могут появиться во время выполнения операций ввода-вывода.

К ним относятся:

  • ошибки преобразования;
  • ошибки данных;
  • ошибки перезаписи.

Как правило, использование специальных технических средств для отладки (API-логгеров, логов операционной системы, профилировщиков и пр.) и программирование с защитой от ошибок помогает обнаружить и решить лишь часть из них.

Логические ошибки. Они могут возникать из ошибок, которые были допущены при выборе методов, разработке алгоритмов, определении структуры данных, кодировании модуля.

В эту группу входят:

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

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

Методы отладки программного обеспечения

Метод ручного тестирования

Отладка программы заключается в тестировании вручную с помощью тестового набора, при работе с которым была допущена ошибка. Несмотря на эффективность, метод не получится использовать для больших программ или программ со сложными вычислениями. Ручное тестирование применяется как составная часть других методов отладки.

Метод индукции

В основе отладки системы — тщательный анализ проявлений ошибки. Это могут быть сообщения об ошибке или неверные результаты вычислений. Например, если во время выполнения программы завис компьютер, то, чтобы найти фрагмент проявления ошибки, нужно проанализировать последние действия пользователя. На этапе отладки программы строятся гипотезы, каждая из них проверяется. Если гипотеза подтвердилась, информация об ошибке детализируется, если нет — выдвигаются новые.

Вот как выглядит процесс:

Алгоритм отладки по методу индукции

Важно, чтобы выдвинутая гипотеза объясняла все проявления ошибки. Если объясняется только их часть, то либо гипотеза неверна, либо ошибок несколько.

Метод дедукции

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

Отладка по методу дедукции

Метод обратного прослеживания

Эффективен для небольших программ. Начинается с точки вывода неправильного результата. Для точки выдвигается гипотеза о значениях основных переменных, которые могли привести к ошибке. Далее на основании этой гипотезы строятся предположения о значениях переменных в предыдущей точке. Процесс продолжается до момента, пока не найдут ошибку.

Как выполняется отладка в современных IDE

Ранние отладчики, например gdb, представляли собой отдельные программы с интерфейсами командной строки. Более поздние, например первые версии Turbo Debugger, были автономными, но имели собственный графический интерфейс для облегчения работы. Сейчас большинство IDE имеют встроенный отладчик. Он использует такой же интерфейс, как и редактор кода, поэтому можно выполнять отладку в той же среде, которая используется для написания кода.

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

Пошаговое выполнение — это набор связанных функций отладчика, позволяющих поэтапно выполнять код.

Шаг с заходом (step into)

Команда выполняет очередную инструкцию, а потом приостанавливает процесс, чтобы с помощью отладчика было можно проверить состояние программы. Если в выполняемом операторе есть вызов функции, step into заставляет программу переходить в начало вызываемой функции, где она приостанавливается.

Шаг с обходом (step over)

Команда также выполняет очередную инструкцию. Однако когда step into будет входить в вызовы функций и выполнять их строка за строкой, step over выполнит всю функцию, не останавливаясь, и вернет управление после ее выполнения. Команда step over позволяет пропустить функции, если разработчик уверен, что они уже исправлены, или не заинтересован в их отладке в данный момент.

Шаг с выходом (step out)

В отличие от step into и step over, step out выполняет не следующую строку кода, а весь оставшийся код функции, исполняемой в настоящее время. После возврата из функции он возвращает управление разработчику. Эта команда полезна, когда специалист случайно вошел в функцию, которую не нужно отлаживать.

Как правило, при пошаговом выполнении можно идти только вперед. Поэтому легко перешагнуть место, которое нужно проверить. Если это произошло, необходимо перезапустить отладку.

У некоторых отладчиков (таких как GDB 7.0, Visual Studio Enterprise Edition 15.5 и более поздних версий) есть возможность вернуться на шаг назад. Это полезно, если пропущена цель либо нужно повторно проверить выполненную инструкцию. 

Я использую повышение в моем проекте. Я скачал скомпилированные бинарные файлы отсюда http://boost.teeks99.com/

При связывании получаю такую ​​ошибку:

Error 18 error LNK2005: "public: void __cdecl boost::thread::join(void)" (?join@thread@boost@@QEAAXXZ) already defined in boost_thread-vc110-mt-1_52.lib(boost_thread-vc110-mt-1_52.dll) C:OlegprojectsMBClientFastNativeAdapterlibboost_thread-vc110-mt-1_52.lib(thread.obj) FastNativeAdapter

Почему буст содержит два lib с таким похожим названием, в чем разница между ними?

  • libboost_thread-vc110-мт-1_52.lib
  • boost_thread-vc110-мт-1_52.lib

Как исправить ошибку компоновки?

обн Я скомпилировал повышение сам. я добавил boost_1_53_0stagelib каталог для компоновщика. Этот каталог на самом деле содержит 3 «копии» «каждого» файла, например:

  • boost_atomic-vc110-мт-1_53.dll
  • boost_atomic-vc110-мт-1_53.lib
  • libboost_atomic-vc110-мт-1_53.lib

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

Я пытался удалить все файлы «libboost *» из папки, но затем я получаю такую ​​ошибку:
Error 15 error LNK1104: cannot open file 'libboost_date_time-vc110-mt-1_53.lib'

Я пытался удалить все файлы «boost * lib» из папки, но затем я получаю такую ​​ошибку:
Error 15 error LNK1104: cannot open file 'boost_thread-vc110-mt-1_53.lib'

Потом я скопировал boost_thread-vc110-mt-1_53.lib назад, и я получаю много ошибок, как это:

Error 16 error LNK2005: "public: virtual __cdecl boost::detail::thread_data_base::~thread_data_base(void)" (??1thread_data_base@detail@boost@@UEAA@XZ) already defined in boost_thread-vc110-mt-1_53.lib(boost_thread-vc110-mt-1_53.dll)

Поэтому, когда нет boost_thread-vc110-mt-1_53.lib компилятор утверждает, что он отсутствует, когда есть boost_thread-vc110-mt-1_53.lib Компилятор утверждает, что «функция уже определена». Пробалы как-то я использую динамическое и статическое связывание одновременно или что-то в этом роде?

UPD2 я не прокомментировал #define BOOST_ALL_DYN_LINK как предложено Вот и теперь код компилируется! Я расследую, все ли в порядке. Однако я не понимаю, почему я должен раскомментировать #define BOOST_ALL_DYN_LINK поэтому комментарии приветствуются.

9

Решение

Другие решения

Я думаю, что в первую очередь вам нужно исправить свой вопрос. Вы имеете в виду (я думаю, вы уже знаете разницу между DLL а также LIB )

  • libboost_thread-vc110-мт-1_52.lib
  • boost_thread-vc110-мт-1_52.длл

или же

  • libboost_thread-vc110-мт-1_52.lib
  • boost_thread-vc110-мт-1_52.Lib

Во всяком случае, похоже, проблема в том, что вы смешиваете статические (libboost_thread-vc110-mt-1_52.lib) и поделился (boost_thread-vc110-mt-1_52.lib) повысить библиотеки. Но без рабочей среды и деталей платформы я не смогу найти точное решение. Если вы работаете в Visual Studio тогда вы можете перейти к right click on project file > properties > linker > input > ignore specific library и добавить libboost_thread-vc110-mt-1_52.lib там и попробуй.

0

задаю вопрос сам.
нужно раскомментировать #define BOOST_ALL_DYN_LINK (см. описание)

0

Еще одна идея / решение, чтобы попробовать, если вы нажмете error LNK1104: cannot open file 'libboost_date_time-*.lib' ошибка:

В наш проект мы включили boost/date_time.hpp файл. Определяем постоянную BOOST_ALL_NO_LIB вместо BOOST_ALL_DYN_LINK в настройках нашего проекта нужно сказать, чтобы boost не автоматически выбирал библиотеки для ссылки.
Увидеть повышение документация Для получения дополнительной информации об этой опции.

Чтобы вы могли добавить BOOST_ALL_NO_LIB в Свойствах проекта -> C / C ++ -> Препроцессор -> Определения препроцессора и проверьте, исчезла ли ошибка компоновщика.

0

Антон219

0 / 0 / 0

Регистрация: 09.06.2013

Сообщений: 72

1

18.06.2014, 01:14. Показов 2963. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Привет, народ! Уже очень долго не могу разобраться со следующей проблемой, есть 4 маленьких файла:
——————————-

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
//файл ClassTest.h
#pragma once
#include "main.h"
class classTest
{
public:
    classTest(void);
    ~classTest(void);
};
-------------------------------
//файл ClassTest.cpp
#include "classTest.h"
#include "main.h"
 
classTest::classTest(void)
{
}
 
classTest::~classTest(void)
{
}
-------------------------------
//файл main.h
#ifndef MAIN_H
#define MAIN_H
int i;
#endif //MAIN_H
-------------------------------
//файл main.cpp
#include "classTest.h"
#include "main.h"
 
int main()
{
    return 0;
}

——————————-

выдает ошибку:
1>—— Построение начато: проект: Test, Конфигурация: Debug Win32 ——
1> main.cpp
1> classTest.cpp
1> Создание кода…
1>main.obj : error LNK2005: «int i» (?i@@3HA) уже определен в classTest.obj
1>c:usersantondocumentsvisual studio 2010ProjectsTestDebugTest.exe : fatal error LNK1169: обнаружен многократно определенный символ — один или более
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

В чем тут дело? В компоновке? Что делать, если нужно файл многократно включать в другие файлы? Очень нужна помощь! Пожалуйста помогите!



0



alsav22

5496 / 4891 / 831

Регистрация: 04.06.2011

Сообщений: 13,587

18.06.2014, 01:37

2

Цитата
Сообщение от Антон219
Посмотреть сообщение

В чем тут дело?

Не нужно в .h файлах делать определения:

C++
1
int i; // объявление с определением, выделяется память под i

Это нужно делать в .cpp файлах, а в .h делать объявления:

C++
1
extern int i; // только объявление, память под переменную i не выделяется

Добавлено через 3 минуты
Определение переменной в программе (выделение памяти) должно быть только одно, объявлений может быть сколько угодно.



1



0 / 0 / 0

Регистрация: 09.06.2013

Сообщений: 72

18.06.2014, 17:50

 [ТС]

3

Спасибо, alsav22! Все получилось!))



0



Понравилась статья? Поделить с друзьями:
  • Как найти стихотворение на 23 февраля
  • Как найти катет прямоугольного треугольника если известна
  • Как составить план мероприятий для библиотеки
  • Как найти особенности лексики
  • Как найти похожие фотографии на телефоне