У меня есть файлы .lib и .dll, но не .h - как использовать методы из этих библиотек в других проектах C ++? - PullRequest
0 голосов
/ 12 марта 2020

Привет всем!

У меня следующая ситуация: мне нужно импортировать в свой проект Visual Studio 2019 C ++ (вызов этого A ) методы из другого очень очень большого проекта (вызов этого B ). На самом деле у меня есть файл .sol для этого B проекта, и я могу успешно собрать библиотеку stati c ( B.lib ), а также динамические c ( B). длл ). Проблема в том, что я хочу вызвать некоторые методы из B в A , но я не могу просто загрузить заголовок B и создать некоторый класс в A , который наследует необходимый класс в B со всеми необходимыми методами, потому что B действительно очень большой проект, и в «главном заголовке» используются лоты из самоопределяемых классов, которые просто включены в проект, и я действительно застряну, пытаясь импортировать заголовок, чтобы заставить заголовок работать, чтобы заставить "основной" заголовок работать в моем проекте и т. д. c. Я думаю, вы поняли.

Вторая вещь более конкретная: я пытался загрузить DLL с LoadLibrary и GetProcAdress. Оно работает. На самом деле в B для всех методов, которые мне действительно нужны, определена пустая внешняя версия каждого из них, которая принимает указатель на объект класса в качестве параметра. Вопрос в том, как получить экземпляр этого класса, если в B нет фабричной функции, то есть функция, возвращающая указатель на этот необходимый объект класса, который я мог бы загрузить из .dll в мой A ? Я не мог прикрепить правильный код, так как он защищен от непрерывного копирования. Может быть, это будет возможно с файлом .lib? Как эти две вещи работают вместе, это действительно мой вопрос.

Итак, есть ли способ, как я мог получить методы из этих библиотек? Пожалуйста, объясните подробнее, если у вас есть время, я младший в разработке C ++, и я не всегда четко понимаю, что это означает что-то. как "просто ссылку .lib файл и использовать его" - как использовать? .. и так далее

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 13 марта 2020
Библиотеки

Stati c увеличивают размер кода в вашем двоичном файле. Они всегда загружаются, и любая версия кода, с которой вы скомпилировали, является версией кода, который будет выполняться.

Dynami c библиотеки хранятся и управляются отдельно. И библиотеки Dynami c не являются обязательно загружаются - они обычно загружаются при первом вызове - и могут использоваться совместно компонентами, использующими одну и ту же библиотеку (несколько загрузок данных, одна загрузка кода).

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

использовать связывание stati c : для связи с файлом .lib вам просто необходимо:

1. Добавьте путь к файлу заголовка в Дополнительные каталоги включения (свойство -> c / c ++ -> Общие -> Дополнительные каталоги включения). 2. Добавьте путь к файлу .lib в каталоги дополнительных библиотек (свойство -> компоновщик. -> Общие -> Дополнительные каталоги библиотеки) 3. Добавьте имя .lib-файла с его расширением в Дополнительные зависимости (свойство -> компоновщик -> ввод -> Дополнительные зависимости). )

Для получения более подробной информации, я предлагаю вам обратиться по ссылке: https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-static-library-cpp?view=vs-2019

Использовать Dynami c связь : Если у вас есть a.dll и a.lib, вы можете использовать статически загруженную dll.

1, добавить путь к файлу заголовка в дополнительные каталоги включения (свойство -> c / c ++ -> General -> дополнительные каталоги включения ) 2, добавьте путь к файлу .lib в каталоги дополнительных библиотек (свойство -> компоновщик -> общие сведения -> дополнительные каталоги библиотек) 3, добавьте имя файла .lib с его расширением в Дополнительные зависимости (свойство -> компоновщик -> ввод -> дополнительные зависимости) 4. Добавьте событие Post-Build в свой проект, чтобы добавить команду, которая копирует DLL в выходной каталог вашей сборки (Свойства> События сборки> Событие после сборки)

Для получения более подробной информации, я предлагаю вам обратиться к ссылке: https://docs.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=vs-2019

Если DLL не имеет соответствующего файла .lib, то DLL может быть загружена только с помощью Dynami c загрузка. * 102 9 *

1, создайте указатель на функцию, тип данных указателя которой должен соответствовать вызывающей функции экспорта DLL. 2, через функцию Win32 API LoadLibrary (), явно вызывающую DLL, эта функция возвращает дескриптор экземпляра DLL. 3, посредством функции Win32 API GetProcAddress (), чтобы получить адрес функции вызываемой DLL, результат присваивается типу указателя пользовательской функции. 4, используйте указатель функции для вызова функции DLL. 5. После завершения последнего вызова функция DLL освобождается с помощью функции Win32 API FreeLibrary ().

Для более подробной информации, я предлагаю вам обратиться по ссылке: https://docs.microsoft.com/zh-cn/windows/win32/dlls/using-run-time-dynamic-linking

0 голосов
/ 12 марта 2020

Этого можно достичь, статически связав B с A. Сначала вы должны построить решение B и получить файл lib. Затем добавьте файл lib в качестве дополнительной зависимости к проекту A. Наконец, разделите заголовочные файлы B и добавьте местоположение заголовочного файла в раздел Additional Include Directories в A.

Шаги:

  1. Постройте B и получите B.lib

  2. Из исходного кода B извлеките файлы заголовков в отдельный каталог. (давайте назовем этот каталог INC_DIR)

  3. Откройте решение A, щелкните правой кнопкой мыши проект, выберите свойства A, чтобы открыть окно свойств.
  4. В окне свойств go до C / C ++ -> Дополнительно Включить каталоги. Добавьте расположение INC_DIR в каталоги дополнительных включений
  5. В окне свойств go в компоновщик -> Общие -> Дополнительные каталоги библиотек. Добавьте расположение B.lib в каталоги дополнительных библиотек.
  6. В окне свойств go для компоновщика -> Ввод -> Дополнительные зависимости. Добавьте имя библиотеки (B.lib) в Дополнительные зависимости.

Эта ссылка ясно показывает, что делать: { ссылка }.

Поиск по inte rnet Stati c библиотека ссылок + Visual Studio для получения дополнительной информации.

...