0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 1
|
||||||||||||||||
1 | ||||||||||||||||
Ошибки в VS 2019: LNK2019 и LNK 112003.05.2019, 21:57. Показов 6213. Ответов 14
Привет, форумчане! Не могу исправить четыре ошибки:
~lab_1 header.h
0
|
|
03.05.2019, 21:57 | |
Ответы с готовыми решениями:
14
Выдает ошибку (LNK 2019) в коде Ошибка LNK 2019: ссылка на неразрешенный внешний символ LNK 2019 и extern "C" Устранение ошибки LNK2019 |
0 / 0 / 0
Регистрация: 19.09.2021
Сообщений: 11
|
||||||||||||||||
19.09.2021, 14:00 | 3 | |||||||||||||||
У меня похожая проблема.
Попытка вынести реализацию шаблона класса в отдельный файл (Test.h, Test.cpp) приводит к ошибке на этапе сборки. Если перенести код из Test.cpp в MainTest.cpp к функции main(), то сборка происходит без ошибок. Если отказаться от шаблона, а прописать для int, то сборка тоже происходит без ошибок. Ошибка LNK2019 ссылка на неразрешенный внешний символ "public: __thiscall Test<int>::Test<int>(int)" (??0?$Test@H@@QAE@H@Z) в функции _main. Test C:\Users\User\source\repos\Test\Test\TestMain.obj 1 https://github.com/sergeyrokhin/Test В случае, если удалю этот тестовый репозиторий: Test.h
0
|
фрилансер
5231 / 4768 / 1003
Регистрация: 11.10.2019
Сообщений: 12,506
|
|
19.09.2021, 14:32 | 4 |
1
|
0 / 0 / 0
Регистрация: 19.09.2021
Сообщений: 11
|
||||||
19.09.2021, 15:10 | 5 | |||||
Я подозревал, что для использования класса компилятор должен создать по шаблону соответствующие определения.
Но не понятно было, почему бы компилятору не посмотреть во все модули и найти все используемые типы. Получается, что требуется явно указать, какие типы будут использоваться Решение: достаточно в модуль Test.cpp добавить строку
https://stackoverflow.com/ques... eader-file
0
|
фрилансер
5231 / 4768 / 1003
Регистрация: 11.10.2019
Сообщений: 12,506
|
|
19.09.2021, 15:38 | 6 |
rokhin, но тогда все используемые типы так придётся в этом месте перечислить. Если такое решение устраивает, то ок
https://onlinegdb.com/3pJ-YGzucq
0
|
0 / 0 / 0
Регистрация: 19.09.2021
Сообщений: 11
|
|
19.09.2021, 15:51 | 7 |
Да, перечислять - это плохое решение.
А как заставить компилятор искать во всех модулях упоминания экземпляров шаблона?
0
|
фрилансер
5231 / 4768 / 1003
Регистрация: 11.10.2019
Сообщений: 12,506
|
|
19.09.2021, 15:56 | 8 |
rokhin, никак
![]() Если прописывать типы нет возможности, то придётся оставить весь шаблон в заголовке
0
|
0 / 0 / 0
Регистрация: 19.09.2021
Сообщений: 11
|
|
19.09.2021, 18:21 | 9 |
А почему компилятор, увидев использование шаблона, не может скомпилировать для этого использования соответствующую реализацию?
0
|
0 / 0 / 0
Регистрация: 19.09.2021
Сообщений: 11
|
|
20.09.2021, 11:08 | 10 |
Алексей1153, Получается, что придется *.cpp превратить в *.h
т.е. *.cpp не нужны? И ещё. Если будет много модулей cpp, где будет использоваться этот заголовочный файл, то в каждом модуле будет компилироваться своя функция?
0
|
фрилансер
5231 / 4768 / 1003
Регистрация: 11.10.2019
Сообщений: 12,506
|
|
20.09.2021, 11:14 | 11 |
rokhin, да, весь код шаблона придётся перенести в заголовок
Добавлено через 3 минуты для каждого типа аргумента будет создана своя функция. в каждом cpp будет компилиться один экземпляр функции каждого типа аргумента
0
|
Вездепух
![]() ![]() 11182 / 6125 / 1677
Регистрация: 18.10.2014
Сообщений: 15,424
|
|
21.09.2021, 17:15 | 12 |
Именно так компилятор и работает. Но для этого ему нужно видеть определение шаблона, разумеется.
А вы предлагаете "спрятать" определение шаблона куда-то в .cpp файл. Из чего компилятор будет "компилировать реализацию", если теперь он не видит определение шаблона?Да, именно так обычно это и работает. Но если это шаблонная функция со внешним связыванием, то потом линкер аккуратно удалит все дубликаты и в финальной программе останется только одна копия.
1
|
0 / 0 / 0
Регистрация: 19.09.2021
Сообщений: 11
|
|
21.09.2021, 17:40 | 13 |
почему бы не поискать определение шаблона в модулях проекта?
Наверняка есть этому причина, и я уже смирился, что код будет написан в заголовочном файле. Но это размещение портит хорошую идею шаблона, и модульности проекта, и будет компилироваться одинаковый код для всех модулей, где будет встречаться использование шаблона. Добавлено через 3 минуты ну если сборщик удалит, то молодец. но почему бы не "докомпилировать" то, что не нашел.
0
|
Вездепух
![]() ![]() 11182 / 6125 / 1677
Регистрация: 18.10.2014
Сообщений: 15,424
|
|
21.09.2021, 18:01 | 14 |
В каких "модулях"? В С++ исторически нет поддержки "модулей". Есть единицы трансляции (читай:
.cpp файлы), которые с испокон веков компилируются строго независимо, тщательно изолированно от любых других единиц трансляции. Компилятор не может ничего нигде "искать". Компилятор не имеет права даже знать о существовании какие-то других единиц трансляции. Это важнейший фундаментальный принцип - принцип независимой трансляции - на котором построен весь процесс компиляции в С и С++. Знание о всех компонентах программы доступно только линкеру, но не компилятору. Компилятор всегда работает в изолированной "песочнице": в единственной единице трансляции. Поддержка модулей в С++ появилась в С++20, но это совсем другая история. Добавлено через 4 минуты Сборщик не умеет ничего "компилировать". Он сборщик, а не компилятор. Альтернативные реализации когда-то существовали (Sun Solaris), в которых шаблоны компилировались в несколько проходов: первым проходом просто анализировался исходный код и коллекционировались все версии шаблонов, которые фактически понадобятся, вторым проходом генерировался фактический код для них, сразу в единственном экземпляре. Но это делалось в первую очередь для того, чтобы не тратить производительность на генерацию повторяющегося кода. Однако с ростом производительности платформ такая экономия оказалась не нужной. Проще просто тупо сгенерировать множество копий кода, а потом вычистить дубликаты. (Плюс у вас еще есть явное инстанцирование для оптимизации этого процесса, если вы захотите этим заняться).
0
|
0 / 0 / 0
Регистрация: 19.09.2021
Сообщений: 11
|
|
09.09.2022, 09:19 | 15 |
Проблема компилятора и сборщика мне стала понятна из обсуждений.
И мне тоже не сильно помогли советы гуру. Но сегодня нашел ссылку в документации Microsoft, которая всё объяснила, предложила два способа решения и дала рекомендации по предпочтениям этих способов. Документация: https://docs.microsoft.com/ru-... -templates
0
|
09.09.2022, 09:19 | |
09.09.2022, 09:19 | |
Помогаю со студенческими работами здесь
15
LNK 2019 ссылка на неразрешенный внешний символ в функции _main; LNK 1120 неразрешенных внешних элементов: 1 LNK 1120 & LNK2019 (WinAPI) Работа с tinyxml ошибки LNK 2019 и LNK 2001 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |