Inconsistent dll linkage ошибка

Обновлено: 08.07.2024

Ниже мы рассмотрим проблемы с работой DDL файлов в самых популярных версиях операционной системы Windows, разберем почему возникают проблемы с DLL, а также предоставим способы их устранения.

Содержание:

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

Почему возникают ошибки с DLL?

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

Из-за ошибок DLL приложение может не корректно работать или вовсе не загружаться, поэтому следует ознакомиться с возможными причинами появления ошибок.

Одной из основных причин возникновения ошибок DLL является простое отсутствие библиотек, которые требуются для работы приложений. Недостающие файлы могут быть удалены самим пользователем, уничтожены вирусами или перезаписанными более старыми версиями в процессе установки программных компонентов. Помимо этого, ошибки могут возникать из-за неправильной работы драйверов, недостающего программного обеспечения, такого как NET Framework, DirectX и т.д.

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

Решение проблем с DDL файлами

DLL библиотеки тесно вплетены в различные системные процессы, поэтому при повреждении некоторых из них операционная система может попросту перестать запускаться. Если это произошло, следует прибегнуть к встроенным средствам восстановления системы. Чтобы попасть в среду восстановления, достаточно вставить загрузочную флешку или диск с Windows либо автоматически попасть в среду после трех неудачных попыток загрузки.

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

Если проблема кроется в некорректной работе загрузчика, рекомендуем ознакомиться со способами решения этой проблемы в статье «Как восстановить загрузчик Windows 10».

Недостающие компоненты C++ Runtime Library и DirectX

Чаще всего пользователи сталкиваются с проблемой ошибок DLL, которые связаны с отсутствием необходимых компонентов C++ Runtime Library либо DirectX.

Существует два способа решения проблем с недостающими компонентами DLL. Первый и более правильный – полная переустановка сбойного ПО. Второй – скачивание непосредственно одного компонента, вызывающего ошибку.

Ошибка msvcr100.dll – сбойный компонент в системе безопасности.

Ошибки dxgi.*, d3dx9_25.*, d3d11.*, d3dx9.*, d3dx9_43.*, xinput1_3.*, d3dx9_31.*, xinput1_2.*, d3dx9_31.*, d3dx9_34.*, d3dx9_42.*, x3daudio1_7.*, x3daudio1_6.*, xrsound.* d3dx10_43.*, d3dx9_26.*, d3dx9_30.*, d3dx9_27.*, d3dx11_43.*, d3dcompiler_43.*, d3d10.*.

Ошибка steam_api.dll – распространённая ошибка среди геймеров и пользователей магазина цифровой дистрибуции Steam. Часто возникает при установке пиратских сборок игр и взломанных клиентов Steam.

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

Ошибка xlive – проблемы с файлами цифрового магазина Microsoft.

Ошибка msvcrt.*, msvcr71.*, msvcrt.*, msvcp120.*, msvcp110.* x64 msvcr90.*, msvcr110.*, msvcr100.*, msvcr80.*, msvcr120.*.

Ошибка physxcudart_20.*, physxloader.* и т.д.- проблемы с файлами NVIDIA PHYSX SYSTEM.

Удаление сбойного приложения

В некоторых случаях установка компонентов может не помочь, поскольку проблема кроется в сбойной программе, использующей DLL библиотеки.

Чтобы определить сбойное приложение, необходимо:

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

Шаг 2. В открывшемся окне выбираем режим отображения «Категория» и переходим в «Удаление программы».

Шаг 3. В списке установленных программ выбираем метод сортировки по дате и находим приложение, после которого начались проблемы с файлами DLL. Это может быть компьютерная игра, устаревшая версия какой-либо программы или любое другое приложение. Для удаления программы достаточно дважды кликнуть левой кнопкой мыши по её имени и провести деинсталляцию.

Обновление драйверов устройства

Нередки случаи, когда ошибки DLL библиотек возникали из-за устаревшей версии драйверов жестких дисков и другого оборудования. Чтобы исключить эти неисправности следует провести обновление драйверов видеокарты и оборудования. Как правило, это можно сделать на официальных сайтах производителей компонентов.

Помимо этого, рекомендуем проверить драйвера носителей следующим образом:

Шаг 1. Находясь в панели управления выбираем пункт «Оборудование и звук».

Шаг 2. В открывшемся окне переходим в пункт «Диспетчер устройств».

Шаг 3. Переходим во вкладку «Дисковые устройства», выбираем нужный носитель и нажимаем по нему ПКМ, после чего в меню будет доступен пункт «Обновить драйвер».

Другие проблемы с DLL библиотеками

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

Чтобы сделать это из работающей системы, необходимо:

Шаг 1. Нажать ПКМ по кнопке «Пуск» и выбрать пункт «Выполнить». В открывшемся окне вводим команду «rstrui.exe» и нажимаем «Ок».

Что делать, если важный файл или DLL библиотека были случайно удалены?

Библиотеки DLL, как и любые другие данные, могут пострадать по многим причинам: повреждение вирусами, случайное удаление сочетанием клавиш Shift+Delete, форматирование или изменение файловой системы и логической структуры диска и т.д.

В таких случаях незаменимым помощником станет специальная утилита для восстановления данных RS Partition Recovery.

Функционал программы позволяет производить быстрое восстановление удаленных файлов с жестких дисков, карт памяти, флеш-накопителей и других носителей любых типов. Для работы RS Partition Recovery используется два метода анализа диска: полный – для поиска всех возможных для восстановления данных, и быстрый – поверхностный анализ носителя для поиска информации, которая была удалена недавно. Это позволяет выбирать и использовать наиболее эффективный метод, способный вернуть DDL библиотеки, изображения, медиафайлы, компоненты программ и другую информацию независимо от расширения.

И я не буду определять EXPORT (для импорта уже экспортированного класса с членом static ), почему я получаю эти предупреждения:

Если я определяю EXPORT , он работает. Я как бы понимаю предупреждения, но я думал, что статическая переменная и ctor могут быть проигнорированы компилятором, потому что весь класс объявлен как __declspec(dllimport) в любом случае. Я хочу использовать одну и ту же базу кода для __declspec(dllexport) и __declspec(dllimport) , но, похоже, компилятор stll пытается определить эти символы, помеченные как __declspec(dllexport) в их объявлении. Какова распространенная практика для решения этой проблемы?

Вы ожидаете, что компилятор проигнорирует очень серьезное несчастье. Он встретил атрибут __declspec (dllimport) в объявлении класса, который совершенно недвусмысленно заявляет, что реализация класса присутствует в другом модуле, который будет привязан во время выполнения. Но тогда это столкнулось с определением также, совершенно неожиданным, поскольку контракт атрибута говорит, что он скомпилирован в совершенно другом проекте.

Предупреждение C4273 генерируется, чтобы напомнить вам, что очень неясно, какая функция на самом деле будет выполняться во время выполнения. Есть два, один из которых занят компиляцией, другой - в DLL. Какой из них действительно будет выполнять, это дикая догадка. C4273 - предупреждение уровня 1, которое соответствует категории "это почти наверняка неправильно". Не совсем нормально работать, потому что есть некоторые предположения, что функции имеют по крайней мере один и тот же код. Однако шансы, которые не вызовут проблемы, невелики, он может работать только в том случае, если функция не имеет побочных эффектов, которые изменяют внутреннее состояние DLL. Очень трудно диагностировать ошибку, когда она делает бит.

Затем он столкнулся с экспортируемой переменной. В одном и том же случае их два. Это то, где программист-компилятор опустил ногу, используя код, случайно использующий тот или иной, уже не то, что можно игнорировать. Это просто не может работать, переменные не могут иметь одинаковое значение. Таким образом, C2491 является жесткой ошибкой.

Не знаю, как вы попали в этот маринован, очевидно, что дорога, которую вы пытаетесь путешествовать, заставит вас упасть с крутого обрыва.

Я пытаюсь использовать возможность Excel VBA для доступа и использования функций из файлов DLL.

Следуя инструкциям из руководства Mircosoft о том, как создать файл DLL, приводит к 3 предупреждениям (C4273), когда я пытаюсь построить проект, для трех объявленных функций:

Когда VBA в Excel пытается получить доступ к созданному DLL-файлу из этого руководства, он выдает ошибку времени выполнения (453): 'Не удается найти точку входа DLL Добавьте в «путь \ file.dll».

Когда дело касается языка C \ C ++, я новичок. Я потратил более 6 часов на:

  • пытаюсь внести изменения в ванильный учебник
  • начать сначала
  • поиск в Google помощи и подобные проблемы
  • внесение изменений в инструкции в VBA

И все же я чувствую себя дальше от решения.

Я использую 32-битный Excel в 64-битной Windows.

Любая помощь приветствуется :)

Изменить

Файлы кода (по запросу):

Вы определили символ MATHLIBRARY_EXPORTS в своем проекте MathLibrary ? Когда вы получаете предупреждения? при сборке dll? Не могли бы вы опубликовать весь код (включая VBA или, если возможно, простой сценарий VB , чтобы вырезать Excel , чтобы уменьшить сложность)? В качестве примечания «доступ и использование функций»: метод не может быть просто вызван как функция (через GetProcAddress ), потому что ему нужен его контекст (класс). Кроме того, я не думаю, что VBA поддерживает изменение имени компилятора C ++. @PhilBrubaker, нет, я не определил символ MATHLIBRARY_EXPORTS ; но, согласно Учебник Microsoft:" По умолчанию шаблон нового проекта для DLL добавляет PROJECTNAME_EXPORTS к определенным символам препроцессора для проекта DLL " @CristiFati, после Учебник Microsoft: после" создания решения "на шаге 5, когда я перехожу в окно Список ошибок , отображается inconsistent dll linkage ошибка для 3 функций. Мне удалось воспроизвести тот же Предупреждение компилятора (уровень 1) C4273 ошибка, следуя той же Пошаговое руководство: руководство по созданию и использованию библиотеки динамической компоновки (C ++) и ошибка MATHLIBRARY_EXPORTS с простой орфографической ошибкой. Так, например, если вы создали проект с именем «MyMathLibrary», даже с правильно названными исходными файлами, вы можете столкнуться с этой проблемой. Я бы рекомендовал пройтись снова, на VS2015 проблем нет.

1 ответ

Я собираюсь опубликовать это в решении, поскольку это не вписывается в комментарий.

Предупреждение « несовместимая связь DLL »: я скопировал ваш точный код из вопроса, так как он на данный момент (он может измениться в будущем ) и поместил его во вновь созданный проект VStudio 2015 :

  • Тип конфигурации: динамическая библиотека ( .dll )
  • Использование предварительно скомпилированных заголовков (хотя я обычно этого не делаю)

Проект скомпилирован без предупреждений , если я определю MATHLIBRARY_EXPORTS :

Единственное, что я могу представить, чтобы вы по-прежнему получали предупреждение при создании своего, это то, что вы определяете макрос для неправильной конфигурации .
Пример: вы создаете свой проект для Debug - x86 , но вы определяете макрос для Release - x86 (или Debug - x64 ).
Вы должны проверить (лучше выбрать All Platfroms и All Configurations и определить макрос только один раз), что конфигурации сборки и конфигурации настроек соответствуют , как на изображении ниже:

VStudio project settings

Но в любом случае это предупреждение является безобидным, .dll все еще создается, а символы экспортированы.

Не удается найти точку входа DLL Добавить в "путь \ file.dll"

Как я указал в одном из своих комментариев, я не думаю, что Excel может импортировать экспорт стиля C ++ из-за [MS.Docs]: оформленные имена (изменение имени C ++ ). Во время поиска Добавить ваша .dll экспортирует следующие символы, как показано на изображении ( Dependency Walker ) ниже (вы можете поиграть с выделенную кнопку и посмотрите, как Dependency Walker может разобрать эти имена):

enter image description here

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

Ниже мы рассмотрим проблемы с работой DDL файлов в самых популярных версиях операционной системы Windows, разберем почему возникают проблемы с DLL, а также предоставим способы их устранения.

Содержание:

  • Почему возникают ошибки с DLL?
  • Решение проблем с DDL файлами.
  • Недостающие компоненты C++ Runtime Library и DirectX.
  • Удаление сбойного приложения.
  • Обновление драйверов устройства.
  • Другие проблемы с DLL библиотеками.
  • Что делать если важный файл или DLL библиотека были случайно удалены?

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

Почему возникают ошибки с DLL?

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

Из-за ошибок DLL приложение может не корректно работать или вовсе не загружаться, поэтому следует ознакомиться с возможными причинами появления ошибок.

Одними из основных причин возникновения ошибок DLL является простое отсутствие библиотек , которые требуются для работы приложений. Недостающие файлы могут быть удалены самим пользователем, уничтожены вирусами или перезаписанными более старыми версиями в процессе установки программных компонентов. Помимо этого, ошибки могут возникать из-за неправильной работы драйверов , недостающего программного обеспечения таких, как NET Framework, DirectX и т.д.

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

Решение проблем с DDL файлами

DLL библиотеки тесно вплетены в различные системные процессы, поэтому при повреждении некоторых из них, операционная система может попросту перестать запускаться. Если это произошло, следует прибегнуть к встроенным средствам восстановления системы . Что бы попасть в среду восстановления достаточно вставить загрузочную флешку или диск с Windows, либо автоматически попасть в среду после трех неудачных попыток загрузки .

Пункты "Восстановление системы" "Восстановление образа системы" и "Восстановление при загрузке" подойдут для решения большинства логических проблем операционной системы. Пункты "Восстановление системы" "Восстановление образа системы" и "Восстановление при загрузке" подойдут для решения большинства логических проблем операционной системы.

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

Если проблема кроется в некорректной работе загрузчика, рекомендуем ознакомится со способами исправления в статье «Как восстановить загрузчик Windows 10» .

Недостающие компоненты C++ Runtime Library и DirectX

Чаще всего пользователи сталкиваются с проблемой ошибок DLL, которые связаны с отсутствием необходимых компонентов C++ Runtime Library либо DirectX .

Существует два способа решения проблем с недостающими компонентами DLL. Первый и более правильный – полная переустановка сбоящего ПО. Второй – скачивание непосредственного одного компонента, вызывающего ошибку.

Ошибка msvcr100.dll – сбойный компонент в системе безопасности.

Ошибки dxgi.* , d3dx9_25.*, d3d11.*, d3dx9.*, d3dx9_43.*, xinput1_3.*, d3dx9_31.*, xinput1_2.*, d3dx9_31.*, d3dx9_34.*, d3dx9_42.*, x3daudio1_7.*, x3daudio1_6.*, xrsound.* d3dx10_43.*, d3dx9_26.*, d3dx9_30.*, d3dx9_27.*, d3dx11_43.*, d3dcompiler_43.*, d3d10.*.

Ошибка steam_api.dll – распространённая ошибка среди геймеров и пользователей магазина цифровой дистрибуции Steam. Часто возникает при установке пиратских сборок игр и взломанных клиентов Steam.

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

Ошибка uplay_r1_loader.* , Uplay.exe, uplay.*, ubiorbitapi_r2_loader.* — аналогичная ошибка, как и с со Steam.

Ошибка xlive – проблемы с файлами цифрового магазина Microsoft.

Ошибка msvcrt.* , msvcr71.*, msvcrt.*, msvcp120.*, msvcp110.* x64 msvcr90.*, msvcr110.*, msvcr100.*, msvcr80.*, msvcr120.*.

Ошибка physxcudart_20.* , physxloader.* и т.д.- проблемы с файлами NVIDIA PHYSX SYSTEM.

Удаление сбойного приложения

В некоторых случаях установка компонентов может не помочь, поскольку проблема кроется в сбойной программе , использующей DLL библиотеки.

Чтобы определить сбойное приложение, необходимо:

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

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