C++: LINK: debug\XXXXX.exe не найден или не создан последней добавочной ссылкой; выполнение полной ссылки
Используя visual studio 2008 SP1,
Эта строка:
LINK : debug\XXXXX.exe not found or not built by the last incremental link; performing full link
Появляется каждый раз, когда я компилирую проект, независимо от того, насколько маленькое изменение я делаю.
Какие могут быть причины для этого?
7 ответов
Так что получается, что проблема решается самостоятельно, если я добавлю /INCREMENTAL
в командной строке компоновщика. Это несмотря на тот факт, что поведение по умолчанию в соответствии с документами состоит в том, чтобы включить инкрементное связывание.
Странный.
Старый вопрос, но на всякий случай для кого-то это все еще проблема (и это..).
Инкрементная ссылка несовместима с генерацией файла манифеста (Proj opts > Linker > Manifest File > Generate Manifest: Yes). Действительно, генерация манифеста модифицирует exe/dll, поэтому компоновщик должен выполнить полную связь.
Есть некоторые обходные пути, для более подробной информации: http://chadaustin.me/2009/05/incremental-linking-and-embedded-manifests/
Временное (и самое простое / быстрое) решение - отключить генерацию манифеста во время разработки и снова включить его на этапе выпуска. Хотя это отключает графический интерфейс в стиле XP/Vista для приложения (элементы управления выглядят как в "классическом режиме").
Стрельба в темноте, но...
Вы перемещаете XXXXX.exe из того места, где он построен, в другое место? Весь смысл инкрементальной ссылки состоит в том, чтобы изменить существующий exe. Если их нет, это будет сложно...
Другая возможная причина заключается в том, что файл был изменен после сборки (возможно, другим инструментом)...
Все причины перечислены в разделе справки для / INCREMENTAL:
Кроме того, LINK выполняет полную ссылку, если возникает любая из следующих ситуаций:
Файл инкрементного статуса (.ilk) отсутствует. (LINK создает новый файл.ilk для подготовки к последующему добавочному связыванию.)
Для файла.ilk нет разрешения на запись. (LINK игнорирует файл.ilk и ссылается ненамного.)
Выходной файл.exe или.dll отсутствует.
Временная метка.ilk, .exe или.dll изменена.
Опция LINK изменена. Большинство опций LINK при изменении между сборками приводят к полной ссылке.
Файл объекта (.obj) добавлен или опущен.
Объект, который был скомпилирован с параметром /Yu /Z7, изменен.
- Загрузите procmon от Microsoft.
- Запустите его, настройте фильтр так, чтобы вы искали доступ к пути, содержащему ваше имя.exe.
- Сделайте ссылку.
- Посмотрите, какие у него проблемы - находит ли он, регистрирует ли он ошибку при открытии. Procmon будет регистрировать каждый файл, открытый, прочитанный, закрытый и т. Д. Если он получит ошибку, он зарегистрирует его.
- Также убедитесь, что он может найти файл.ilk - я думаю, что это тоже нужно.
(Также в темноте) Одна из возможных причин заключается в том, что вы используете заголовок всего проекта, ссылающийся на __DATE__
макро. Но в этом случае вы бы также увидели полную перекомпиляцию (не так ли?)
В моем случае я получил эту ошибку вчера.
Набор VS code generation > runtime Library
в Multi-threaded Debug DLL (/MDd)
вместо Multi-threaded Debug (/MTd)
,
Если я воссоздаю новый проект, эти плохие настройки повторяются снова. Я вручную переключаюсь на /Mtd
, то никакой ошибки не происходит.
Я запускал пакетный сценарий и удалял exe-файл перед компиляцией, чтобы затем проверить наличие скомпилированного exe-файла после компиляции перед запуском exe-файла:
pushd build
del win32_handmade.exe
cl -FC -Zi ..\code\win32_handmade.cpp user32.lib Gdi32.lib
IF EXIST "win32_handmade.exe" call "../build/win32_handmade.exe"
Конечно, используя@REM
закомментировать строку, удаляющую exe, можно, но это даже не решение :
@REM del win32_handmade.exe
Я нашел один способ обойти сообщение об ошибке: когда вы удаляете .exe, вы можете избежать появления предупреждающего сообщения, также удалив любой .ilk, который содержит данные связи:
del win32_handmade.exe
del win32_handmade.ilk
На данный момент лучшее решение, которое я нашел, — отключить инкрементальное связывание.Вы можете сделать это, добавив/link /INCREMENTAL:NO
до конца вашей команды cl, вот так:
cl -FC -Zi ..\code\win32_handmade.cpp user32.lib Gdi32.lib /link /INCREMENTAL:NO