LNK2019: неразрешенный внешний символ при использовании статической библиотеки в Windows

Вопрос или проблема

Я создал статическую библиотеку на Windows, используя StaticLibrary в качестве ConfigurationType:

<ConfigurationType>StaticLibrary</ConfigurationType>

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

error LNK2001: unresolved external symbol OrtGetApiBase 

Но я проверил с помощью dumpbin /symbols свою статическую библиотеку:

6976 00000000 UNDEF  notype ()    External     | OrtGetApiBase

https://learn.microsoft.com/en-us/cpp/build/reference/symbols?view=msvc-170:

Пятая колонка (Static, External) указывает, видим ли символ только внутри этого объекта или он публичен (видим снаружи).

Так почему это не работает? Как я могу это исправить?

Одно, что я заметил, это то, что dumpbin /exports возвращает пустой результат. Не совсем пустой, но не списывает никаких символов.

Ответ или решение

Ошибка LNK2019 «неразрешенный внешний символ» возникает, когда компилятор не может найти определение функции, которая была объявлена, но не реализована в текущем контексте. В вашем случае вы используете статическую библиотеку, и вот шаги, чтобы понять причину ошибки и решить её.

Причины Ошибки LNK2019:

  1. Отсутствие определения функции: Проверьте, действительно ли функция, которую вы пытаетесь использовать (в данном случае OrtGetApiBase), внедрена в вашем статическом библиотеке. Вы можете использовать dumpbin /symbols, чтобы увидеть все объявленные и определенные функции.

  2. Неправильная компоновка библиотеки: Убедитесь, что вы компилируете статическую библиотеку и вызывающую ее программу с одинаковыми параметрами компиляции. Например, если библиотека была скомпилирована с использованием углубленных или специфичных флагов, они должны совпадать в обоих проектах.

  3. Необходимые зависимости: Проверьте, не требует ли ваша библиотека другие библиотеки, которые не были связаны с вашим проектом. Иногда внешние зависимости могут также вызывать такие ошибки.

  4. Проблемы согласования имен: В языке C++ возможны конфликты имен, особенно при использовании пространства имен или макросов. Убедитесь, что имя функции совпадает с тем, что определено в библиотеке.

  5. Подключение неполной библиотеки: Убедитесь, что вы подключили правильный файл статической библиотеки в ваш проект. Иногда могут быть случайно подключены другие версии или файлы.

Как исправить ошибку:

  1. Проверка определений:

    • Убедитесь, что функция OrtGetApiBase объявлена и определена в вашей статической библиотеке. Если функция определена в другом месте (например, в другой библиотеке или файле), убедитесь, что вы называете её правильно.
  2. Используйте dumpbin:

    • Запустите dumpbin /symbols ИмяБиблиотеки.lib и посмотрите, есть ли определение для OrtGetApiBase. Если его нет, значит, функция не реализована в статической библиотеке.
    • Также запустите dumpbin /exports ИмяБиблиотеки.lib, чтобы подтвердить, что необходимые функции экспортируются.
  3. Настройки проекта:

    • Проверьте конфигурацию проекта (Debug/Release) и убедитесь, что вы используете соответствующие версии библиотек. Также проверьте, что файл библиотеки добавлен в список зависимостей вашего проекта (Project -> Properties -> Linker -> Input -> Additional Dependencies).
  4. Проверьте зависимости:

    • Просмотрите уровень зависимостей и подключите все необходимые библиотеки, которые могут быть нужны для работы вашего кода.
  5. Переопределение функций:

    • Если функция не может быть найдена из-за конфликта имен, возможно, стоит рассмотреть использование директивы extern "C" для C++ функцией, чтобы избежать манглирования имен.

Итог:

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

Оцените материал
Добавить комментарий

Капча загружается...