Не удается открыть файл libcmt lib
Пожалуйста, помогите, я весь день пытался скомпилировать свое приложение на C ++.
Мой проект содержит один исходный файл: Foo.cpp. Вот его код:
как видите, я пытался использовать JNI, но не думаю, что это имеет какое-либо отношение к проблеме. Вот что я пробовал в командной строке:
В моем окружении я установил:
ВКЛЮЧАЙТЕ: C: _ \ include; C: \ frankenstein \ includes; C: \ Program Files \ Java \ jdk1.6.0_24 \ include; C: \ Program Files \ Java \ jdk1.6.0_24 \ include \ win32; C: _ \ include \ win32; C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ include
LIBPATH: C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ lib
Я проверил в каталоге lib, он содержит файл "libcmt.lib". Не знаю, чувствителен ли он к регистру, но я знаю, что я никогда ничего не менял в файлах или каталогах Visual Studio.
Подскажите, пожалуйста, как я могу заставить эту работу работать?
задан 20 фев '12, 00:02
Кстати, этот файл существует на моем диске: C: _ \ include \ com_Foo.h, зависимость от libcmt должна исходить косвенно от jni.h include. - msknapp
Я думаю, это могло произойти из-за того, что код не создавался в Visual Studio, но все равно пытались использовать его компилятор. Я создал приложение в Code :: Blocks, и когда мне не удалось заставить работать компилятор MinGW32 g ++, я попытался использовать компилятор Visual Studio. Возможно, это предполагает определенную конфигурацию проекта. Возможно ли, что компилятор Visual Studio работает только тогда, когда проект был построен в Visual Studio? - msknapp
Возможно, это довольно старый тред, но, поскольку я столкнулся с ним сейчас, я подумал, что это может быть полезно. Ответ @mrsheen ниже сработал для меня, но мне пришлось запустить программу из cmd разработчика, а не из обычного (где ошибка сохранялась). Просто к вашему сведению для тех, кто все еще может это искать. - prateek1592
Не удается открыть сторонний файл библиотеки
Существует несколько распространенных причин этой проблемы.
Путь к файлу библиотеки может быть неверным или не заключен в двойные кавычки. Или, возможно, вы не указали его для компоновщика.
Возможно, вы установили 32-разрядную версию библиотеки, но при этом собираетесь на 64 бит или наоборот.
Библиотека может зависеть от других библиотек, которые не установлены.
Может потребоваться предоставить каталог библиотеки, переопределяющий каталог стандартной библиотеки. В командной строке используйте параметр /libpath . В интегрированной среде разработки используйте свойство Дополнительные каталоги библиотек на странице свойств " Общие" компоновщика > свойств > конфигурации для проекта.
Убедитесь, что установлены все версии библиотеки, необходимые для создаваемых конфигураций. воспользуйтесь программой управления пакетами vcpkg , чтобы автоматизировать установку и настройку для многих распространенных библиотек. По возможности лучше создавать собственные копии сторонних библиотек. Затем вы убедитесь, что все локальные зависимости библиотек созданы для тех же конфигураций, что и ваш проект.
Не удается открыть приложение или его PDB-файл
Не удается открыть файл библиотеки Майкрософт
Приложение выполняется или загружается в отладчике
Если filename — имя исполняемого файла или связанный с ним PDB-файл, см. раздел Если приложение уже запущено. Затем проверьте, загружен ли он в отладчик. Чтобы устранить эту проблему, перед повторным созданием программы закройте программу и выгрузите ее из отладчика. Если приложение открыто в другой программе, например в редакторе ресурсов, закройте его. Если программа не отвечает, может потребоваться завершить процесс с помощью диспетчера задач. Также может потребоваться закрыть и перезапустить Visual Studio.
8 ответы
Воскрешение этой темы в конце 2018 года, поскольку ни одно из других решений не помогло в моем случае :)
Для меня эта ошибка начала появляться из ниоткуда после того, как я установил Набор драйверов для Windows для полностью не связанный проект.
Если тебе не нужно "Спектр смягчения" (скорее всего, вы этого не сделаете) и, увидев эту ошибку, весьма вероятно, что вам просто нужно установить Свойства проекта (страницы свойств) -> Свойства конфигурации -> C / C ++ -> Генерация кода -> Spectre Mitigation в Отключено.
Волшебным образом это было установлено на Включено установщиком инструментов Visual Studio для WDK во всех проектах, даже несмотря на то, что они не имели ничего общего с WDK, и не был выбран набор инструментов платформы для каких-либо вещей, связанных с драйверами. Microsoft в лучшем виде.
ответ дан 11 дек '18, 22:12
Большое спасибо. это работает, интересно, как вы пришли к такому выводу? :) - Нусрат Нуриев
@CEOatApartico Я этого не делал .. это было больше похоже на метод проб и ошибок. Думаю, я провел с этим несколько дней, пробуя что-то новое, и вдруг я заметил то, чего раньше не видел. поэтому я попытался отключить его :) - Алекс Кремер
для нас это было менее безболезненно :) - Нусрат Нуриев
Это должно быть отмечено как ответ, спасло мне день, большое спасибо! - n0ne
@nOne рад, что это сработало для вас. Я думаю, что мой ответ - более новая проблема, чем та, что была у OP :) в любом случае приятно видеть, что это помогает людям. - Алекс Кремер
Я подозреваю, что в командной строке, которую вы используете для запуска компилятора, не определены все необходимые переменные среды.
Чтобы убедиться, что среда командной строки настроена правильно, убедитесь, что вы запустили vsvars32.bat командный файл.
Это устранило мою проблему! Спасибо! - сибли
Просто чтобы добавить сюда свой опыт, так как это может кому-то помочь, и это применимо к более новым версиям VS (2017 в моем случае).
У меня была аналогичная ошибка во время компиляции, когда я перенес свой проект на новую машину. Я наконец выяснил, что в одном из проектов в моих зависимостях было включено снижение риска, а библиотеки с этой поддержкой по умолчанию не включены:
Да, это то, что исправило это и для меня. Флаг / QSpectre теперь включен по умолчанию, но по умолчанию он не устанавливает библиотеки с ослабленным Spectre. Странный выбор значений по умолчанию, но запуск установщика и установка этой опции устранили проблему для меня. - Reirab
У меня это сработало, когда я получил…
Имя вашего проекта == «Название проекта» для этого примера.
Перейти к 'Обозреватель решений'окно вашего проекта.
Щелкните ПРАВО на «Имя проекта», а не на «Имя проекта» решения.
Это откроет длинное меню.
Внизу есть "Свойства" Нажмите здесь.
Это откроет «Название проектаОкно страниц свойств.
ЕСЛИ в названии окна (вверху слева) написано .
Закройте это окно, вы щелкнули правой кнопкой мыши на Решения, а не проект, вам нужно щелкнуть правой кнопкой мыши имя проекта.
Левая панель раскрыть Свойства конфигурации
Затем нажмите Общие
Теперь на правой панели должен отображаться значок 'Общие«Свойства конфигурации» для вашего текущего проекта.
Посмотрите вниз по списку, чтобы 'Набор инструментов платформы'
Если версия VS, которую вы используете, не указана, вам необходимо ее изменить.
Чтобы изменить версию VS, просто поместите указатель мыши в конец отображаемого имени текущей версии VS и щелкните.
В правой части этой строки появится поле со стрелкой вниз, щелкните по нему.
Откроется окно со списком версий VS.
Выберите версию VS, которую вы СЕЙЧАС используете.
Это окно должно закрываться, и ваш выбор должен был заменить старую версию VS проекта, которая использовалась для сборки вашего проекта, когда я был впервые создан.
Теперь попробуйте собрать Project.
Надеюсь, это поможет, у меня это работает, когда я работаю над проектами, созданными с помощью более ранних версий VS.
Please help, I have spent all day trying to make my c++ app compile.
My project contains one source file: Foo.cpp. Here is its code:
as you can see I was trying to use JNI, but I don't think that has anything to do with the problem. Here is what I tried on the command line:
In my environment I have set:
INCLUDE: C:_\include;C:\frankenstein\includes;C:\Program Files\Java\jdk1.6.0_24\include;C:\Program Files\Java\jdk1.6.0_24\include\win32;C:_\include\win32;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include
LIBPATH: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib
I checked in the lib directory, it contains a "libcmt.lib" file. Don't know if it is case sensitive, but I know that I never changed anything in the visual studio files or directories.
Would somebody please tell me how I can make this work?
BTW, this file exists on my drive: C:_\include\com_Foo.h, the dependency on libcmt must come indirectly from the jni.h include.
I think this might stem from not creating the code in visual studio, but trying to use its compiler anyways. I created the application in Code::Blocks, and when I could not make the MinGW32 g++ compiler work, I tried using the visual studio compiler. Perhaps it assumes a certain project configuration. Is it possible that the visual studio compiler only works when the project was built in visual studio?
This is perhaps quite an old thread, but since I ran into it now, I thought it might be useful. @mrsheen's answer below worked for me, but I had to run the program from the developer cmd rather than the normal (where the error persisted). Just an FYI for someone who might still be looking for this out there.
Приложение заблокировано антивирусным сканированием
Антивирусные программы часто временно блокируют доступ к вновь созданным файлам, особенно .exe и .dll исполняемые файлы. Чтобы устранить эту проблему, попробуйте исключить каталоги сборки проекта из антивирусного сканера.
Справка, моей проблемы нет в списке!
The run-time libraries now contain directives to prevent mixing different types. You will receive this warning if you try to use different types or debug and non-debug versions of the run-time library in the same program. For example, if you compiled one file to use one kind of run-time library and another file to use another kind (for example, debug versus retail) and tried to link them, you will get this warning. You should compile all source files to use the same run-time library. For more information, see the /MD, /MT, /LD (Use Run-Time Library) compiler options.
You can use the linker's /VERBOSE:LIB switch to find out which libraries the linker searches. For example, when your executable uses the multi-threaded, non-debug run-time libraries, the list reported should include LIBCMT.lib, and not LIBCMTD.lib, MSVCRT.lib, or MSVCRTD.lib. You can tell the linker to ignore the incorrect run-time libraries by using /NODEFAULTLIB for each library you want to ignore.
The table below shows which libraries should be ignored depending on which run-time library you want to use. On the command line, use one /NODEFAULTLIB option for each library to ignore. In the Visual Studio IDE, separate the libraries to ignore by semi-colons in the Ignore Specific Default Libraries property.
To use this run-time library | Ignore these libraries |
---|---|
Multithreaded (libcmt.lib) | msvcrt.lib; libcmtd.lib; msvcrtd.lib |
Multithreaded using DLL (msvcrt.lib) | libcmt.lib; libcmtd.lib; msvcrtd.lib |
Debug Multithreaded (libcmtd.lib) | libcmt.lib; msvcrt.lib; msvcrtd.lib |
Debug Multithreaded using DLL (msvcrtd.lib) | libcmt.lib; msvcrt.lib; libcmtd.lib |
For example, if you received this warning and you want to create an executable file that uses the non-debug, DLL version of the run-time libraries, you could use the following options with the linker:
Недостаточно места на диске
Эта ошибка может возникать, если на диске недостаточно места. Компоновщик использует временные файлы в нескольких ситуациях. Даже если на диске достаточно места, большие ссылки могут выпустить или фрагментировать свободное место на диске. Рассмотрите возможность использования параметра /OPT (оптимизация) . выполнение транзитного исключения COMDAT считывает все объектные файлы несколько раз.
Библиотеки для розничной торговли, отладки или конкретной платформы
Эта ошибка может возникнуть при первой сборке для новой целевой платформы или конфигурации, например в розничной торговле или ARM64. в интегрированной среде разработки проверьте, установлены ли набор инструментов платформы и Windows SDK версии , указанной на странице свойств общие . также убедитесь, что необходимые библиотеки доступны в каталогах библиотек , указанных на странице свойств каталоги VC++. Проверьте свойства каждой конфигурации, например Debug, Retail, x86 или ARM64. Если одна сборка работает, но другая нет, Сравните параметры обоих параметров. Установите все отсутствующие необходимые инструменты и библиотеки.
Проблемы с путями или именами файлов
Слишком большие файлы
Эта ошибка может возникать из-за слишком большого размера файла. Библиотеки или объектные файлы, размер которых превышает гигабайт, может вызвать проблемы для 32-разрядного компоновщика. Возможным исправлением этой проблемы является использование 64-разрядного набора инструментов. Дополнительные сведения о том, как использовать 64-разрядный набор средств в командной строке, см. в разделе как включить 64-разрядный Visual C++ набор инструментов в командной строке. сведения о том, как использовать 64-разрядный набор инструментов в интегрированной среде разработки, см. в разделе использование MSBuild с 64-разрядным компилятором и инструментами. также см. статью Stack Overflow post: как сделать Visual Studio использовать собственную цепочки инструментов amd64.
Другие распространенные проблемы
Дополнительные зависимости, указанные в интегрированной среде разработки
При указании отдельных библиотек в свойстве Дополнительные зависимости используйте пробелы для разделения имен библиотек. Не используйте запятые или точки с запятой. При использовании пункта меню Правка для открытия диалогового окна Дополнительные зависимости используйте символы новой строки для разделения имен, а не запятых, точек с запятой или пробелов. Также используйте символы новой строки при указании путей к библиотекам в папках библиотек и дополнительных каталогах библиотек .
Библиотека vccorlib. lib
Проблемы в переменной среды TMP
Если имя файла LNKnnn, то это имя файла, созданного компоновщиком для временного файла. Каталог, указанный в переменной среды TMP, может не существовать. Кроме того, для переменной среды TMP может быть задано несколько каталогов. Для переменной среды TMP должен быть указан только один путь к каталогу.
обновленные библиотеки Windows SDK
Не удается открыть файл "К:\програм.ОБЖ"
Чтобы устранить эту проблему для сборок из командной строки, проверьте параметры параметра /libpath . Также проверьте пути, указанные в переменной среды LIB, и пути, указанные в командной строке. Обязательно используйте двойные кавычки для всех путей, содержащих пробелы.
Чтобы устранить эту проблему в интегрированной среде разработки, при необходимости добавьте двойные кавычки для следующих свойств проекта:
свойство каталоги библиотеки на странице свойств конфигурации > VC++ каталоги
Свойство " Дополнительные каталоги библиотек " на странице свойств " Общие" компоновщика > свойств > конфигурации
Свойство Дополнительные зависимости на странице свойств входных данных компоновщика > свойств > конфигурации .
Неправильные разрешения для файла
Эта ошибка может возникать, если у вас недостаточно разрешений для доступа к файлу filename. Это может произойти, если для доступа к файлам библиотеки в защищенных системных каталогах используется обычная учетная запись пользователя. Или, если вы используете файлы, скопированные с других пользователей, у которых все еще есть исходный набор разрешений. Чтобы устранить эту проблему, переместите файл в каталог проекта с возможностью записи. Если перемещенный файл имеет недоступные разрешения, выполните команду takeown.exe в окне командной строки администратора, чтобы стать владельцем файла.
8 Answers 8
Resurrecting this thread in late 2018 since none of the other solutions helped my case :)
For me this error started appearing out of nowhere after i installed Windows Driver Kit for a completely unrelated project.
If you don't need "Spectre Mitigation" (you most likely do not) and seeing this error it's highly probable that you just have to set Project Properties (property pages) -> Configuration Properties -> C/C++ -> Code Generation -> Spectre Mitigation to Disabled.
Magically it was set to Enabled by the installer of Visual Studio tools for WDK in all projects even tho they got nothing to do with WDK nor the Platform toolset was selected for any driver related stuff. Microsoft at its finest.
@CEOatApartico i did not.. it was more like trial and error. I think i have spent days with this back then trying things out and suddenly i noticed something that i have not seen there before. so i tried to disable it :)
@nOne glad it worked for you. I think my answer is to a newer problem than that the OP had :) either way it's good to see it helps people.
I suspect the command prompt you are using to run the compiler does not have all the required environment variables defined.
To make sure the command line environment is correctly configured make sure you have run the vsvars32.bat batch file.
This does not fix the problem. On my system, cl doesn't work unless I run vsvars32.bat first. I still get the error though.
Just to add my experience here, since it may help someone, and it applies to newer VS editions (2017 in my case).
I was getting a similar error during compiling when I moved my project to a new machine. I finally figured out that one of the projects in my dependencies had spectre mitigation turned on, and the libs with that support are not included by default:
Yes, this is what fixed it for mine, as well. The /QSpectre flag is enabled by default now, but it doesn't install the Spectre-mitigated libraries by default. Strange choice of defaults, but running the installer and checking this option fixed the issue for me.
This worked for me when I got …
Your project name == “Project Name” for this example.
Go to the 'Solution Explorer' window for your Project.
RIGHT Click on the Project "Project Name", not the Solution "Project Name".
This will open a long menu.
At the bottom is "Properties" Click on it.
This will open the “Project Name” Property Pages window.
IF the name of the window (upper left) says.
“Solution 'Project Name' Property Pages
Close this window, you right clicked on the Solution, not the Project, you need to right click on the project name.
On the “Project Name” Property Pages
Left hand panel expand Configuration Properties
Then click on General
Now the right panel should show the 'General' Configuration Properties' for your current Project.
Look down the list to 'Platform Toolset'
If the version of VS you are using is not the one listed you needed to change it.
To change the version of VS just put you mouse pointer at the end of the current VS version name that is displayed and click.
A box with a down arrow will show at the right hand side of that row, click on it.
This will open a window with a list of VS versions.
Pick the version of VS you are NOW using.
That window should close, and your selection should have replaced the old project VS version that was used to build your project when I was first built.
Then at bottom of “Project Name” Property Pages click Apply, then OK.
Now try to build Project.
I hope this helps, it works for me when working on projects that were built with earlier versions of VS.
Выполняется связывание с несовместимыми библиотеками.
Библиотеки времени выполнения теперь содержат директивы для предотвращения смешивания разных типов. Это предупреждение появляется при попытке использовать различные типы или отладочные и неотладочные версии библиотеки времени выполнения в одной программе. Например, если один файл был скомпилирован для использования одной разновидности библиотеки времени выполнения, а другой файл — для использования другого типа (например, отладка и розничная торговля) и предпринята попытка связать их, это предупреждение будет выдано. Для использования одной библиотеки времени выполнения следует компилировать все исходные файлы. Дополнительные сведения см. в разделе Параметры компилятора /MD,/MT,/LD (используйте Run-Time Library) .
Вы можете использовать параметр компоновщика /verbose: lib , чтобы узнать, какие библиотеки ищет компоновщик. Например, если исполняемый файл использует многопоточные неотладочные библиотеки времени выполнения, список отчетов должен включать LIBCMT. lib, а не LIBCMTD. lib, MSVCRT. lib или MSVCRTD. lib. Можно указать компоновщику игнорировать неправильные библиотеки времени выполнения, используя параметр /NODEFAULTLIB для каждой библиотеки, которую нужно игнорировать.
В таблице ниже показано, какие библиотеки следует игнорировать в зависимости от используемой библиотеки времени выполнения. В командной строке используйте один параметр /NODEFAULTLIB для всех игнорируемых библиотек. в Visual Studio интегрированной среде разработки разделите библиотеки на игнорируемые точками с запятой в свойстве игнорировать конкретные библиотеки по умолчанию .
Использование библиотеки времени выполнения | Игнорировать эти библиотеки |
---|---|
Многопоточная (LIBCMT. lib) | msvcrt. lib; LIBCMTD. lib; MSVCRTD. lib |
Многопоточная с использованием библиотеки DLL (msvcrt. lib) | LIBCMT. lib; LIBCMTD. lib; MSVCRTD. lib |
Отладка многопоточных (LIBCMTD. lib) | LIBCMT. lib; msvcrt. lib; MSVCRTD. lib |
Отладка многопоточного использования с помощью библиотеки DLL (MSVCRTD. lib) | LIBCMT. lib; msvcrt. lib; LIBCMTD. lib |
Например, если вы получили это предупреждение и хотите создать исполняемый файл, который использует неотладочную версию библиотек времени выполнения, можно использовать следующие параметры со компоновщиком:
Эта ошибка возникает, когда компоновщику не удается открыть файл для чтения или записи. Ниже перечислены две наиболее распространенные причины этой проблемы.
Программа уже запущена или загружена в отладчике, и
пути к библиотеке неверны или не заключены в двойные кавычки.
Существует множество других возможных причин этой ошибки. Чтобы сократить их, сначала проверьте Тип файла. Затем используйте следующие разделы для выявления и исправления конкретной проблемы.
Библиотеки в проектах из сетевых или других источников
При построении проекта, скопированного с другого компьютера, расположения установки библиотеки могут отличаться. Для сборок из командной строки убедитесь, что для сборки правильно заданы пути к переменной среды LIB и библиотеке. в Visual Studio можно просмотреть и изменить текущие пути к библиотекам, заданные на страницах свойств проекта. на странице VC++ каталоги выберите элемент управления "раскрывающийся список" для свойства каталоги библиотек , а затем нажмите кнопку изменить. В разделе вычисленное значение диалогового окна каталоги библиотек перечислены текущие пути поиска файлов библиотек. Обновите эти пути, чтобы они указывали на локальные библиотеки.
Библиотеки vcruntime с отслеживанием версий
Слишком длинные пути
Эта ошибка может появиться, когда путь к файлу расширяется до 260 символов. При необходимости измените структуру каталогов или Сократите имена папок и файлов, чтобы сократить пути.
Параллельная синхронизация сборок
если вы используете параллельный вариант сборки, Visual Studio мог заблокировать файл в другом потоке. Чтобы устранить эту проблему, убедитесь, что один и тот же объект кода или библиотека не встроены в несколько проектов. Используйте зависимости сборки или ссылки проекта, чтобы выбрать в проекте созданные двоичные файлы.
Не удается открыть файл, созданный проектом
Эта ошибка может возникать, если файл filename еще не существует, когда компоновщик пытается получить к нему доступ. Это может произойти, когда один проект зависит от другого в решении, но проекты создаются в неправильном порядке. Чтобы устранить эту проблему, убедитесь, что ссылки проекта заданы в проекте, который использует этот файл. После этого отсутствующий файл будет создан до того, как он потребуется. дополнительные сведения см. в статьях добавление ссылок в проекты Visual Studio C++ и управление ссылками в проекте.
Windows библиотеки, например kernel32. lib
Если файл, который не удается открыть, является одним из стандартных файлов библиотеки, предоставляемых корпорацией Майкрософт, например kernel32. lib, может возникнуть ошибка конфигурации проекта или ошибка установки. убедитесь, что Windows SDK установлен. если для проекта требуются другие библиотеки майкрософт, такие как MFC, убедитесь, что компоненты MFC также установлены установщиком Visual Studio. Вы можете снова запустить установщик, чтобы добавить дополнительные компоненты в любое время. Дополнительные сведения см. в Изменение Visual Studio. Используйте вкладку отдельные компоненты в установщике, чтобы выбрать конкретные библиотеки и пакеты SDK.
Читайте также: