Не компилируется файл c
В этом разделе мы рассмотрим некоторые из распространенных проблем, с которыми, похоже, начинающие программисты сталкиваются с довольно высокой вероятностью. Это не исчерпывающий список проблем компиляции или запуска программ, а скорее прагматичный список решений самых основных проблем. Если у вас есть предложения по другим вопросам, которые могут быть добавлены в этот список, опубликуйте их в разделе комментариев ниже.
Файл находится в проекте, но не в пути поиска включаемых файлов
Чтобы устранить эту проблему, исправьте путь, используемый компилятором для поиска включаемого или импортируемого файла. В новом проекте используются пути поиска include по умолчанию. Может потребоваться изменить путь поиска include, чтобы добавить каталог для проекта. При компиляции в командной строке добавьте путь к переменной среды include или /I параметр компилятора, чтобы указать путь к файлу.
чтобы задать путь к каталогу включения в Visual Studio, откройте диалоговое окно страницы свойств проекта. выберите VC++ каталоги в разделе свойства конфигурации в левой области, а затем измените свойство включаемые каталоги . дополнительные сведения о каталогах для отдельных пользователей и проектов, поиск которых выполняется компилятором в Visual Studio, см. в разделе страница свойств VC++ directories. Дополнительные сведения о параметре компилятора см. в /I разделе /I (дополнительные каталоги включаемых данных).
Вы вызываете встроенные функции или передайте типы аргументов в встроенные функции, которые не поддерживаются в целевой архитектуре.
Например, если вы используете AVX2 встроенную функцию, но не указываете параметр компилятора / ARCH : AVX2 , компилятор предполагает, что встроенная функция является extern функцией Al. Вместо создания встроенной инструкции компилятор создает вызов extern символа Al с тем же именем, что и встроенная инструкция. Когда компоновщик пытается найти определение этой отсутствующей функции, он создает ошибку LNK2019. Убедитесь, что используются только встроенные функции и типы, поддерживаемые целевой архитектурой.
Дополнительные причины
Вы установили пакет SDK или библиотеку стороннего производителя, но после установки пакета SDK или библиотеки не открывали новое окно командной строки разработчика. Если пакет SDK или библиотека добавляет файлы в путь поиска включаемых файлов, может потребоваться открыть новое окно командной строки разработчика, чтобы получить эти изменения переменных среды.
Файл использует управляемый код, но параметр /clr компилятора не указан. Дополнительные сведения см. в разделе /clr (компиляция среды CLR).
Файл компилируется с использованием другого /analyze параметра компилятора, чем используется для предварительной компиляции заголовков. При предварительной компиляции заголовков для проекта все должны использовать одни и те же /analyze Параметры. дополнительные сведения см. в разделе /analyze (Code Analysis).
файл или каталог был создан подсистема Windows для Linux, учитывается регистр в каждом каталоге, и указанный регистр пути или файла не соответствует регистру пути или файла на диске.
Файл, каталог или диск доступен только для чтения.
Visual Studio или средства командной строки не имеют достаточных разрешений для чтения файла или каталога. это может произойти, например, когда файлы проекта имеют разные права владения, чем процесс, выполняемый Visual Studio или программ командной строки. иногда эту ошибку можно устранить, запустив Visual Studio или командную строку разработчика от имени администратора.
Недостаточно дескрипторов файлов. Закройте часть приложений и повторите компиляцию. Эта ситуация маловероятна в обычных условиях. Однако она может возникать при построении крупных проектов на компьютере с ограниченной физической памятью.
staticЭлемент данных объявлен, но не определен
Ошибка LNK2019 также может возникать, если static элемент данных объявлен, но не определен. В следующем примере показано возникновение ошибки LNK2019 и приводятся сведения по ее устранению.
Возможные причины
Существует множество способов получения этой ошибки. Все они используют ссылку на функцию или переменную, которую компоновщику не удалось Разрешить, или найти определение для. Компилятор может определить, когда символ не объявлен, но не может определить, не определенли символ. Это связано с тем, что определение может находиться в другом исходном файле или библиотеке. Если символ упоминается, но не определен, компоновщик создает неразрешенную extern ошибку символа Al.
Ниже приведены некоторые распространенные проблемы, вызывающие ошибку LNK2019.
Общие проблемы времени компиляции
Вопрос: Когда я компилирую свою программу, я получаю ошибку о неразрешенном внешнем символе _main или _WinMain@16
Это означает, что ваш компилятор не может найти вашу функцию main() . А все программы должны включать в себя эту функцию.
Есть несколько вещей, которые нужно проверить:
- Содержит ли ваш код функцию с именем main ?
- Правильно ли написано имя main ?
- Когда вы компилируете свою программу, видите ли вы, что файл, содержащий функцию main() , компилируется? Если нет, либо переместите функцию main() в другой файл, либо добавьте этот файл в свой проект (для получения дополнительной информации о том, как это сделать, смотрите урок «2.7 – Программы с несколькими файлами кода»).
- Вы точно создали консольный проект? Попробуйте создать новый консольный проект.
Вопрос: Я пытаюсь использовать функциональность C++11/14/17/XX, но она не работает.
Если у вас старый компилятор, он может не поддерживать эти более свежие дополнения к языку. В этом случае обновите свой компилятор.
В случае с современными IDE/компиляторами ваш компилятор может по умолчанию использовать более старый стандарт языка. Мы рассмотрим, как изменить стандарт языка в уроке «0.12 – Настройка компилятора: выбор стандарта языка».
Вопрос: При попытке использовать cin , cout или endl компилятор говорит, что cin , cout или endl являются «необъявленными идентификаторами».
Во-первых, убедитесь, что вы включили следующую строку в верхней части файла:
Во-вторых, убедитесь, что каждое использование cin , cout и end l имеет префикс " std:: ". Например:
Если это не решит вашу проблему, возможно, ваш компилятор устарел или установка повреждена. Попробуйте переустановить и/или обновить компилятор до последней версии.
Вопрос: При попытке использовать endl для завершения напечатанной строки компилятор говорит, что end1 является «необъявленным идентификатором».
Убедитесь, что вы не перепутали букву l (нижний регистр L) в endl с цифрой 1. endl – это все буквы. Убедитесь, что ваш редактор использует шрифт, который проясняет разницу между строчной буквой L, заглавной i и цифрой 1. Кроме того, во многих шрифтах, не предназначенных для программирования, можно легко перепутать заглавную букву o и цифру ноль.
Проблемы с Visual Studio
Предлагаемое нами решение – отключить предварительно скомпилированные заголовки, как это сделано в уроке «0.7 – Компиляция вашей первой программы».
Если вы хотите, чтобы предварительно скомпилированные заголовки были включены, чтобы решить эту проблему, просто найдите файл(ы), вызывающий ошибку (в приведенной выше ошибке виновником является test.cpp ), и добавьте следующую строку в самом верху файла):
В более старых версиях Visual Studio используется stdafx.h вместо pch.h , поэтому, если pch.h не решает проблему, попробуйте stdafx.h .
Обратите внимание, что для программ с несколькими файлами каждый файл кода C++ должен начинаться с этой строки.
Кроме того, вы можете отключить предварительно скомпилированные заголовки.
Вопрос: Visual Studio выдает следующую ошибку: " 1MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) " (неразрешенный внешний символ _WinMain@16 ).
Скорее всего, вы создали не консольное приложение, а графическое приложение Windows. Создайте заново свой проект и убедитесь, что вы создали его как консольный проект Windows (или Win32).
Вопрос: Когда я компилирую свою программу, я получаю предупреждение " Cannot find or open the PDB file " (не могу найти или открыть файл PDB).
Заявление об отказе от ответственности
Быстрый отказ от публикации
Статьи быстрого публикации предоставляют сведения непосредственно из организации поддержки Майкрософт. Сведения, содержащиеся в этом ниже, создаются в ответ на возникающие или уникальные темы или предназначены для дополнения других сведений базы знаний.
Заявление об отказе от ответственности
Корпорация Майкрософт и(или) ее поставщики не делают никаких представлений или гарантий относительно пригодности, надежности или точности сведений, содержащихся в документах и связанных с ними графиках, опубликованных на этом сайте ("материалы") для любых целей. Эти материалы могут включать технические неточности или опечатки и могут быть пересмотрены в любое время без уведомления.
В максимальной степени, разрешенной применимым законодательством, Корпорация Майкрософт и/или ее поставщики дисклеймировали и исключали все представления, гарантии и условия, будь то экспресс- или подразумеваемые или нормативные, включая представления, гарантии или условия названия, отсутствие нарушения, удовлетворительное состояние или качество, торговая доступность и пригодность для определенной цели, в отношении материалов.
Скомпилированный код функции создает ссылку или вызов символа, но компоновщик не может найти определение символа в любой из библиотек или объектных файлов для связи.
3) Ассемблирование
Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера.
Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле.
Объектный файл — это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, называется объектным кодом.
Далее возможно сохранение данного объектного кода в статические библиотеки для того, чтобы не компилировать данный код снова.
Получим машинный код с помощью ассемблера (as) в выходной объектный файл driver.o:
Но на данном шаге еще ничего не закончено, ведь объектных файлов может быть много и нужно их всех соединить в единый исполняемый файл с помощью компоновщика (линкера). Поэтому мы переходим к следующей стадии.
Включена неправильная версия имени файла
Для встраивания функций в разные исходные файлы используются различные параметры компилятора
Использование встроенных функций, определенных в CPP-файлах, и смешение в различных исходных файлах параметров компилятора для встраивания функций может привести к возникновению ошибки LNK2019. Для получения дополнительной информации см. Function Inlining Problems.
Прочее
Вопрос: У меня есть еще одна проблема, которую я не могу понять. Как я могу быстро получить ответ?
По мере обучения у вас, несомненно, будут возникать вопросы или неожиданные проблемы. Что делать дальше, зависит от вашей проблемы. Но в целом есть несколько вещей, которые вы можете попробовать.
В этой статье приведены способы устранения неполадок компилятора Visual C++ или компоновщика Visual C++.
Применимо к: Microsoft Visual C++ 2010 Express, Visual Studio
Исходный номер базы знаний: 974229
Символ определяется как static , а затем на него указывает ссылка за пределами файла
В C++, в отличие от C, Глобальная const Ants имеет static компоновку. Чтобы обойти это ограничение, можно включить const инициализацию в файл заголовка и включить этот заголовок в cpp-файлы. Кроме того, можно сделать переменную const Ant и использовать const ссылку Ant для доступа к ней.
Зависимость сборки определяется только в качестве зависимости проекта в решении
в более ранних версиях Visual Studio этот уровень зависимости был достаточным. однако начиная с Visual Studio 2010 Visual Studio требуется ссылка междупроектами. Если в проекте нет ссылки проекта на проект, может возникнуть Эта ошибка компоновщика. Чтобы устранить ошибку, добавьте ссылку одного проекта на другой.
Решение
Для проблем компилятора, таких как внутренние ошибки компилятора (т. е. C1001), зависания или сбои, может быть полезно записать выходные данные препроцессора C/C++, чтобы предоставить упрощенный воспроизводимый пример проблемы. В интегрированной среде разработки Visual C++ для этого можно задать для свойства Generate Preprocessed File значение With Line Numbers (/P) или Without Line Numbers (/EP /P). Это свойство можно найти на страницах свойств проекта в разделе "Свойства конфигурации", "C/C++", "Параметры препроцессора".
Этот параметр можно задать на уровне проекта в меню Project. .i В этом случае он создаст файлы для всех исходных файлов в проекте или для одного файла, щелкнув правой кнопкой мыши файл в обозревателе решений, выбрав контекстное меню свойств, чтобы открыть диалоговое окно свойств для одного файла.
Параметр компилятора /P направляет CL.EXE для записи выходных данных препроцессора в файл. Добавление /EP подавит добавление сведений о номере строки в результирующий файл. /P достаточно, но /EP /P создаст меньший выходной файл. Созданный выходной файл препроцессора будет иметь то же имя, что и исходный скомпилированный файл, но с расширением файла a.i, например file1.cpp, создает выходной файл препроцессора file1.i в том же каталоге.
Компиляция продолжится после этапа препроцессора при использовании этого параметра, .OBJ то есть компилятор не создаст файл, и может появиться ошибка ссылки, отражая тот факт, что obJ-файлы не найдены.
Вы можете скомпилировать выходной файл препроцессора самостоятельно за пределами контекста Visual Studio проекта. Файл .i содержит весь код файла заголовка, .C .CPP замену макросов и предварительно обработанные сведения директив компилятора, необходимые для компиляции этого конкретного или исходного файла. Иными словами, это автономный модуль, который должен иметь возможность воспроизвести проблему компиляции без каких-либо зависимостей от других файлов. Результирующий файл часто будет большим и содержать большой объем пробелов.
Проблемы с компоновщиком
Для проблем компоновщика (ошибок типа LNKxxxx) можно использовать параметр командной строки компоновщика /LINKREPRO, чтобы создать тестовый случай, содержащий только входные данные компоновщика без зависимости от исходных файлов. /LINKREPRO использует следующий синтаксис:
'' — это полный путь к пустой папке в локальной файловой системе. Эта папка уже должна существовать. Компоновщик не создаст ее автоматически и создаст ошибку, если папка не существует.
Этот параметр не предоставляется напрямую в системе проекта. Чтобы добавить его в сборку, откройте меню "Свойства проекта**"** Project меню. В окне "Свойства конфигурации ", "Компоновщик ", /LINKREPRO: "Командная строка" в поле "Дополнительные параметры" введите переключатель (включая косую черту) и замените путь на существующий путь к локальной папке. Пример: /LINKREPRO:C:\TEMP\LINKREPRO\ .
Если в этом поле редактирования уже есть другие параметры компоновщика, разделите их запятыми.
Кроме того, можно использовать переменную LINK_REPRO среды. Если переменная LINK_REPRO среды существует, компоновщик считывает выходной путь из переменной среды и создает linkrepro. Параметр /LINKREPRO не требуется при использовании переменной LINK_REPRO среды. Чтобы использовать переменную LINK_REPRO среды, выполните следующие действия.
Откройте Visual Studio командной строке. Он устанавливается в меню " Пуск" Visual Studio папке под Инструменты Visual Studio папке.
Создайте LINK_REPRO переменную среды, указывав на существующий и пустой каталог, например: SET LINK_REPRO=C:\TEMP\LINKREPRO\
Запустите Visual Studio из той же командной строки, чтобы она совместно использует копию измененной среды.
Откройте проект и выполните перестроение всего проекта.
При LINK.EXE в сборке будет скопироваться все необходимое для связывания проекта с каталогом linkrepro. Среди скопированных файлов будут файлы объектов (. OBJ), необходимые файлы библиотеки (. LIB, включая библиотеки Майкрософт и файл ответа компоновщика (LINK. RSP), чтобы link больше не зависел от файла решения.
Чтобы убедиться, что у вас есть все необходимые файлы для воспроизведения проблемы со ссылкой, можно запустить LINK в каталоге, указанном переменной среды LINK_REPRO, используя файл ответа компоновщика, созданный linkrepro: LINK @link.rsp .
Перед этим используйте следующую команду, чтобы отключить эту функцию при использовании переменной среды командной строки. SET LINK_REPRO=
Этот процесс также можно использовать для проверки файлов, участвующих в создании библиотеки, при использовании LIB.EXE LINK /LIB.
Соглашение о вызовах отличается между объявлением функции и определением функции.
Соглашения о вызовах ( __cdecl , __stdcall , __fastcall или __vectorcall ) кодируются как часть декорированного имени. Убедитесь, что соглашение о вызовах одинаково.
Не задана среда командной строки INCLUDE или LIB
Если компилятор вызывается из командной строки, для указания путей поиска часто используются переменные среды. Если путь поиска, описанный в переменной среды include или lib , задан неправильно, может быть сформирована ошибка C1083. Мы настоятельно рекомендуем использовать ярлык командной строки разработчика, чтобы задать базовую среду для сборок с командной строкой. Дополнительные сведения см. в разделе сборка C/C++ в командной строке. Дополнительные сведения об использовании переменных среды см. в разделе инструкции. Использование переменных среды в сборке.
Примеры
Далее приводится несколько примеров кода, вызывающего ошибку LNK2019, а также сведения о том, как устранить ошибку.
1) Препроцессинг
Самая первая стадия компиляции программы.
Получим препроцессированный код в выходной файл driver.ii (прошедшие через стадию препроцессинга C++ файлы имеют расширение .ii), используя флаг -E, который сообщает компилятору, что компилировать (об этом далее) файл не нужно, а только провести его препроцессинг:
Взглянув на тело функции main в новом сгенерированном файле, можно заметить, что макрос RETURN был заменен:
В новом сгенерированном файле также можно увидеть огромное количество новых строк, это различные библиотеки и хэдер iostream.
Функция или переменная объявлена, но не определена
Ошибка LNK2019 может возникать, если объявление существует в файле заголовка, но соответствующее определение не реализовано. Для функций элементов или static элементов данных реализация должна включать селектор области класса. Пример см. в разделе Missing Function Body or Variable.
Средства диагностики
Иногда трудно определить, почему компоновщику не удается найти определенное определение символа. Часто проблема заключается в том, что в сборку не включен код, содержащий определение. Или же параметры сборки создали разные декорированные имена для extern символов Al. Существует несколько средств и параметров, которые могут помочь в диагностике ошибок LNK2019.
Параметр / VERBOSE Компоновщик может помочь определить, на какие файлы ссылается компоновщик. С помощью этого параметра можно проверить, включен ли в сборку файл, содержащий определение символа.
Параметры DUMPBIN/ EXPORTS и / SYMBOLS программы позволяют определить, какие символы определены в .dll и файлах объектов или библиотек. Убедитесь, что экспортированные декорированные имена соответствуют декорированным именам, которые ищет компоновщик.
UNDNAMEПрограмма может отобразить эквивалентный недекорированный extern символ Al для декорированного имени.
Указано неверное имя файла
При вводе имени файла допущена ошибка. Например, примененная к объекту директива
может не найти файл, который вы хотели. Большинство файлов заголовков стандартной библиотеки C++ не имеют расширения h. . Чтобы устранить эту проблему, убедитесь, что указано правильное имя файла, как в следующем примере:
Точка входа не определена
код приложения должен определять соответствующую точку входа: main или wmain для консольных приложений, а WinMain также wWinMain для Windows приложений. Дополнительные сведения см. в разделе main функция и аргументы командной строки или WinMain функция. Чтобы использовать настраиваемую точку входа, укажите параметр компоновщика /Entry (символ точки входа) .
Символ определен в файле C, но объявлен без использования extern "C" в файле C++
Символы, определенные в файле, который компилируется как C, имеют разные декорированные имена, чем символы, объявленные в файле C++, если не используется extern Модификатор "C" . Убедитесь, что объявление соответствует компоновке компиляции для каждого символа. Аналогично, если символ определяется в файле C++, который будет использоваться программой C, в определении следует использовать extern "C" .
Заключение
В данной статье были рассмотрены основы процесса компиляции, понимание которых будет довольно полезно каждому начинающему программисту. В скором времени будет опубликована вторая статья про статические и динамические библиотеки.
Вы пытаетесь связать 64-разрядные библиотеки с 32-битным кодом или 32-bit Library в 64-разрядный код.
Библиотеки и объектные файлы, связанные с вашим кодом, должны быть скомпилированы для той же архитектуры, что и код. Убедитесь, что библиотеки, на которые ссылается проект, компилируются для той же архитектуры, что и проект. Убедитесь, что свойство /libpath или Дополнительные каталоги библиотек указывает на библиотеки, созданные для правильной архитектуры.
Символ объявлен, но не определен
В этом примере переменная Al объявлена, extern но не определена:
Ниже приведен еще один пример, где переменная и функция объявляются как, extern но определение не предоставляется:
Действие
При изучении возможной проблемы с компилятором Microsoft Visual C++ компилятором или компоновщиком важно получить как можно больше сведений о процессе сборки и используемых параметрах. В этой статье рассматриваются некоторые советы по устранению неполадок, которые помогут устранить проблему сборки или получить полную информацию для служба поддержки Майкрософт.
staticЧлен класса не определен
staticЧлен класса должен иметь уникальное определение или будет нарушать правило одного определения. staticЧлен класса, который не может быть определен как встроенный, должен быть определен в одном исходном файле с помощью его полного имени. Если он не определен вообще, компоновщик создает ошибку LNK2019.
Автоматические переменные используются вне области действия
Автоматические переменные (области видимости функции) могут использоваться только в области видимости данной функции. Эти переменные не могут объявляться extern и использоваться в других исходных файлах. Пример см. в разделе Automatic (Function Scope) Variables.
5) Загрузка
Последний этап, который предстоит пройти нашей программе — вызвать загрузчик для загрузки нашей программы в память. На данной стадии также возможна подгрузка динамических библиотек.
Запустим нашу программу:
Пример
В следующем примере создается ошибка C1083, если файл "test.h" заголовка не существует в исходном каталоге или в пути поиска include.
Сведения о том, как создавать проекты C/C++ в интегрированной среде разработки или в командной строке, а также сведения о настройке переменных среды см. в разделе проекты и сборки систем.
В данной статье я хочу рассказать о том, как происходит компиляция программ, написанных на языке C++, и описать каждый этап компиляции. Я не преследую цель рассказать обо всем подробно в деталях, а только дать общее видение. Также данная статья — это необходимое введение перед следующей статьей про статические и динамические библиотеки, так как процесс компиляции крайне важен для понимания перед дальнейшим повествованием о библиотеках.
Все действия будут производиться на Ubuntu версии 16.04.
Используя компилятор g++ версии:
Используется функция, но тип или число параметров не соответствуют определению функции
Объявление функции должно соответствовать определению. Убедитесь, что вызов функции соответствует объявлению и что объявление соответствует определению. Код, который вызывает функции шаблона, также должен иметь совпадающие объявления функции шаблона, включающие те же параметры шаблона, что и определение. Пример несоответствия объявления шаблона см. в разделе Sample LNK2019e. cpp статьи "примеры".
Состав компилятора g++
Мы не будем вызывать данные компоненты напрямую, так как для того, чтобы работать с C++ кодом, требуются дополнительные библиотеки, позволив все необходимые подгрузки делать основному компоненту компилятора — g++.
Параметры объявления не соответствуют определению
Код, который вызывает функции шаблона, должен иметь совпадающие объявления функции шаблона. Объявления должны содержать те же параметры шаблона, что и определение. В следующем примере показано возникновение ошибки LNK2019 для определяемого пользователем оператора и приводятся сведения по ее устранению.
Объектный файл или библиотека, содержащие определение символа, не связаны
в Visual Studio убедитесь, что объектный файл или библиотека, содержащие определение символа, связаны как часть проекта. В командной строке убедитесь, что список файлов для связывания содержит объектный файл или библиотеку.
Общие проблемы во время выполнения
Вопрос: При выполнении программы окно консоли мигает, а затем сразу закрывается.
Во-вторых, добавьте следующий код в конец функции main() (прямо перед оператором return ):
Это заставит вашу программу ждать, пока пользователь нажмет любую клавишу, прежде чем продолжить, что даст вам время изучить вывод вашей программы, прежде чем ваша операционная система закроет окно консоли.
Другие решения, такие как обычно предлагаемое system("pause") , могут работать только в определенных операционных системах, и их следует избегать.
Более старые версии Visual Studio могут не приостанавливаться, когда программа запускается в режиме Начать с отладкой (Start With Debugging) ( F5 ). Попробуйте запустить в режиме Начать без отладки (Start Without Debugging) ( Ctrl + F5 ).
Вопрос: Я запустил свою программу, получил окно, но ничего не выводится.
Выполнение может блокировать ваш антивирус. Попробуйте временно отключить его и посмотрите, не в этом ли проблема.
Вопрос: Моя программа компилируется, но работает некорректно. Что не так?
Отладьте ее! Советы по диагностике и отладке программ приведены далее в главе 3.
Этапы компиляции:
Перед тем, как приступать, давайте создадим исходный .cpp файл, с которым и будем работать в дальнейшем.
driver.cpp:
4) Компоновка
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять как происходит связка, следует рассказать о таблице символов.
Таблица символов — это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору (символу) соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах.
Именно с помощью таблицы символов и хранящихся в них ссылок линкер будет способен в дальнейшем построить связи между данными среди множества других объектных файлов и создать единый исполняемый файл из них.
Получим исполняемый файл driver:
Вы занимаетесь смешением кода, который использует собственный wchar_t код с кодом, который не
действия по согласованности языка C++, выполненные в Visual Studio 2005, сделали wchar_t собственный тип по умолчанию. Если не все файлы были скомпилированы с использованием одних и тех же параметров /Zc: wchar_t , ссылки типа могут не разрешаться в совместимые типы. Убедитесь, что wchar_t типы во всех файлах библиотек и объектов совместимы. Либо обновите из wchar_t определения типа, либо используйте соответствующие параметры /Zc: wchar_t при компиляции.
Непротиворечивые wchar_t определения типов
В этом примере создается библиотека DLL с экспортом WCHAR , который разрешается в wchar_t .
В следующем примере используется библиотека DLL из предыдущего примера и создается LNK2019, так как типы unsigned short* и WCHAR* не совпадают.
Чтобы устранить эту ошибку, измените unsigned short значение на wchar_t или WCHAR или скомпилируйте LNK2019g. cpp с помощью /Zc: wchar_t -.
Проблемы с библиотекой сторонних производителей и vcpkg
если вы видите эту ошибку при попытке настроить библиотеку стороннего производителя в рамках сборки, рассмотрите возможность использования vcpkg, диспетчера пакетов C++ для установки и сборки библиотеки. vcpkg поддерживает большой и растущей список библиотек сторонних производителейи задает все свойства конфигурации и зависимости, необходимые для успешной сборки в рамках проекта.
Возможно, файл заблокирован или используется
Если для изменения или доступа к файлу используется другая программа, файл может быть заблокирован. Попробуйте закрыть файл в другой программе. иногда другая программа может быть Visual Studio сама по себе при использовании параметров параллельной компиляции. Если отключить параметр параллельной сборки, то эта ошибка исчезнет, а это проблема. Эта проблема также может быть вызвана другими системами параллельной сборки. Будьте внимательны при задании зависимостей файлов и проектов, чтобы порядок сборки был правильным. В некоторых случаях рекомендуется создать промежуточный проект для принудительного создания последовательности зависимостей для общего файла, который может быть создан несколькими проектами. Иногда антивирусные программы временно блокируют недавно измененные файлы для проверки. Если возможно, рассмотрите возможность исключения каталогов сборки проекта из антивирусного сканера.
Объявление символа написано не так, как определение символа
Проверьте правильность написания и регистра символов в объявлении и определении, а также в любом месте, где используется или вызывается символ.
Предкомпилированные заголовки еще не скомпилированы
Если проект настроен для использования предварительно скомпилированных заголовков, необходимо создать соответствующие .pch файлы, чтобы можно было скомпилировать файлы, использующие содержимое заголовка. например, pch.cpp файл ( stdafx.cpp в Visual Studio 2017 и более ранних версий) автоматически создается в каталоге проекта для новых проектов. Сначала необходимо скомпилировать этот файл, чтобы создать предкомпилированные файлы заголовков. В типичном проекте процесса сборки это выполняется автоматически. Дополнительные сведения см. в разделе Создание предкомпилированных файлов заголовков.
Дополнительные ресурсы
Компилятор создает ошибку C1083, когда не удается найти требуемый файл. Эта ошибка имеет несколько возможных причин. Наиболее распространенными причинами являются неверный путь поиска include или отсутствующие или неправильно именованные файлы заголовков, но другие типы файлов и проблемы могут также вызвать C1083. Ниже приведены некоторые распространенные причины, по которым компилятор создает эту ошибку.
Зачем нужно компилировать исходные файлы?
Исходный C++ файл — это всего лишь код, но его невозможно запустить как программу или использовать как библиотеку. Поэтому каждый исходный файл требуется скомпилировать в исполняемый файл, динамическую или статическую библиотеки (данные библиотеки будут рассмотрены в следующей статье).
Проблемы с библиотекой сторонних производителей и vcpkg
если вы видите эту ошибку при попытке настроить библиотеку стороннего производителя в рамках сборки, рассмотрите возможность использования vcpkg, диспетчера пакетов C++ для установки и сборки библиотеки. vcpkg поддерживает большой и растущей список библиотек сторонних производителей. Он задает все свойства конфигурации и зависимости, необходимые для успешной сборки в рамках проекта.
Исходный файл, содержащий определение символа, не скомпилирован
в Visual Studio убедитесь, что исходный файл, определяющий символ, компилируется как часть проекта. Проверьте промежуточный каталог выходных данных сборки на наличие соответствующего OBJ-файла. если исходный файл не компилируется, щелкните его правой кнопкой мыши в Обозреватель решений и выберите пункт свойства , чтобы проверить свойства файла. На странице Свойства> конфигурацииОбщие должен отображаться тип элементакомпилятора C/C++. В командной строке убедитесь, что исходный файл, содержащий определение, скомпилирован.
построение консольного приложения с помощью параметров приложения Windows
2) Компиляция
На данном шаге g++ выполняет свою главную задачу — компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
Ассемблерный код — это доступное для понимания человеком представление машинного кода.
Используя флаг -S, который сообщает компилятору остановиться после стадии компиляции, получим ассемблерный код в выходном файле driver.s:
Мы можем все также посмотреть и прочесть полученный результат. Но для того, чтобы машина поняла наш код, требуется преобразовать его в машинный код, который мы и получим на следующем шаге.
Файл не включен в путь поиска включаемых файлов
Это указывает компилятору искать файл в том же каталоге, который содержит исходный файл, а затем искать в других местах, заданных средой сборки. Если кавычки содержат абсолютный путь, компилятор выполняет поиск файла только в этом расположении. Если кавычки содержат относительный путь, компилятор выполняет поиск файла в каталоге относительно исходного каталога.
Если имя заключено в угловые скобки,
Если включаемые файлы находятся в другом каталоге относительно исходного каталога и в директивах Include используется относительный путь, то вместо угловых скобок следует использовать двойные кавычки. Например, если файл myheader.h заголовка находится в подкаталоге именованных заголовков проекта, в этом примере не удается найти файл и вызывается C1083:
но этот пример работает:
Читайте также: