Как включить статическую библиотеку в Visual Studio
Обновлено: 21.11.2024
Цель этого руководства — подробно проиллюстрировать, как создать и связать статическую библиотеку с UE 4.17 с помощью Visual Studio 2017, а также создать собственный узел схемы с помощью этой библиотеки. Это руководство в основном основано на замечательном руководстве Боба Гнея.
Я написал это, потому что хочу помочь таким новичкам, как я, которым трудно следовать руководству Боба, и тем, кто хочет связать свою статическую библиотеку с UE 4.17 с помощью Visual Studio 2017. В моем руководстве больше внимания уделяется устранению неполадок, которые была для меня самой сложной частью. В дополнение к этому я объясню, как сделать свой собственный узел чертежа, используя вашу статическую библиотеку. Если вы знакомы с UE4 и умеете решать проблемы с системой UE4 C++, вы можете просто следовать замечательному руководству Боба.
Для примера, как и в руководстве Боба, я создам библиотеку под названием YJMagicLib и свяжу ее с проектом UE4 под названием UE4Magic .
Область применения и примечания
Важно, чтобы вы компилировали ваши статические библиотеки с той же версией MS Visual Studio, которую вы используете для работы с UE4. Это связано с тем, что каждый выпуск Visual Studio поставляется с другим компилятором, что приводит к несовместимости двоичных файлов. Будьте уверены, если вы перейдете в эту область, вы получите предупреждение при попытке скомпилировать библиотеку.
Создание статической библиотеки
Этот шаг основан на руководстве MSDN. Чтобы следовать моему руководству и понимать его, не требуется читать руководство MSDN. Однако, если вам интересно, вы можете перейти по ссылке и прочитать ее.
Создание проекта статической библиотеки
Чтобы создать проект статической библиотеки
- В строке меню выберите "Файл", "Создать", "Проект".
- На левой панели диалогового окна "Новый проект" разверните узел "Установлено", "Visual C++" и выберите "Рабочий стол Windows".
- На центральной панели выберите Мастер рабочего стола Win32.
- Укажите имя проекта, например YJMagicLib, в поле Имя. Укажите имя решения, например, YJMagicLib, в поле Имя решения. Нажмите кнопку ОК. Затем появится панель Windows Desktop Project.
- На панели "Проект рабочего стола Windows" в разделе "Тип приложения" выберите "Статическая библиотека".
- На панели Проект рабочего стола Windows в разделе Дополнительные параметры снимите флажок Предварительно скомпилированный заголовок.
- Нажмите кнопку "ОК", чтобы создать проект.
Добавление класса в статическую библиотеку
Чтобы добавить класс в статическую библиотеку
- Чтобы создать файл заголовка для нового класса, откройте контекстное меню проекта YJMagicLib в обозревателе решений и выберите «Добавить», «Новый элемент». В диалоговом окне Добавить новый элемент на левой панели в разделе Visual C++ выберите Код. В центральной области выберите файл заголовка (.h). Укажите имя файла заголовка, например, YJMagic.h, а затем нажмите кнопку «Добавить». Отображается пустой файл заголовка.
- Добавьте класс YJMagic для добавления. Код должен выглядеть следующим образом:
внутри YJMagic.h
- Чтобы создать исходный файл для нового класса, откройте контекстное меню проекта YJMagicLib в обозревателе решений и выберите «Добавить», «Новый элемент». В диалоговом окне Добавить новый элемент на левой панели в разделе Visual C++ выберите Код. В центральной области выберите Файл C++ (.cpp) . Укажите имя исходного файла, например, YJMagic.cpp, а затем нажмите кнопку «Добавить». Отображается пустой исходный файл.
- Используйте этот исходный файл для реализации функций YJMagic . Код должен выглядеть следующим образом:
внутри YJMagic.cpp
Настройка для модулей UE4
Прежде чем скомпилировать нашу статическую библиотеку, нам нужно будет внести несколько других изменений, чтобы наши библиотеки можно было легко связать.
Ориентация на 64-битные платформы
В рамках стандартного проекта статической библиотеки мы будем ориентироваться на машины x86 (32-разрядные), которые не будут работать с набором инструментов UE4.
- Откройте страницу свойств проекта.
- Выберите Диспетчер конфигураций.
- Откройте раскрывающийся список Active Solution Platform и выберите
- Введите или выберите x64, если он есть.
- Сохраните его, нажав кнопку "ОК".
Вы должны увидеть его в раскрывающемся списке в верхней части Visual Studio.
Многопоточная DLL
Нереальная система сборки предполагает, что вы предоставите статическую библиотеку, которая затем будет связана с DLL, поэтому мы должны убедиться, что наш проект делает то же самое.
- Откройте страницу свойств проекта.
- Выполните фильтрацию, выбрав «Свойства конфигурации» > «C/C++» > «Генерация кода» > «Библиотека времени выполнения».
- В раскрывающемся списке выберите Многопоточная библиотека DLL (/MD)
- Сохраните его, нажав кнопку "ОК".
Создание в режиме выпуска
Я думаю, что это очень важный шаг. UE4 совместим с библиотеками, созданными в режиме выпуска, если только вы не получите сообщение об ошибке при связывании с UE4.
- Нажмите раскрывающееся меню "Конфигурация решения" в строке меню.
- В раскрывающемся списке выберите Освободить.
- Теперь вы можете скомпилировать статическую библиотеку, выбрав Build , Build Solution в строке меню. Это создает статическую библиотеку, которую мы можем использовать.
Создание проекта UE4 C++ и работа с ошибками
Создать проект UE 4.17 c++. Назовите проект как UE4Magic. Мы свяжем созданную выше статическую библиотеку с этим проектом UE4.
Здесь у вас может возникнуть несколько проблем при компиляции проекта UE4. Я также потратил много времени на решение этих проблем. Вот список проблем и решений, с которыми я столкнулся.
Для тех, у кого установлены VS 2015 Community и VS 2017 Community
Это был точный случай для меня. Я установил как старую версию UE4, так и новейшую версию (4.17) UE4. Старая версия работает только с VS 2015, а последняя версия работает с VS 2017. Так что у меня одновременно были старая и новая VS.
Похоже, существует проблема совместимости между VS 2015 и VS 2017. Я нашел решение здесь, и оно сработало для меня.
Ошибка с сообщением о том, что шестнадцатеричное значение 0x00 является недопустимым символом. '
Я нашел решение этой проблемы здесь.
- Перейдите в папку "C:\Users\user\AppData\Roaming\Unreal Engine\UnrealBuildTool" (папка AppData обычно скрыта, поэтому сначала следует отобразить папку AppData) и удалите файл BuildConfiguration.xml.
Для тех, кто установил только VS 2017, а не VS 2015
Сторонний каталог
Ваши файлы lib должны находиться в корневом каталоге вашего проекта/x64/Release, если вы не изменили их заранее. Ваши h-файлы должны находиться в корневом каталоге вашего проекта/названии вашего проекта .
Если бы вы следовали моему руководству, путь был бы следующим:
- Путь к файлам библиотеки: "./YJMagicLib/x64/Release"
- Путь к файлам H: "./YJMagicLib/YJMagicLib"
Мы переместим их отсюда в наш каталог проектов UE4 для удобства использования и последующей упаковки.
Откройте новое окно проводника и перейдите в каталог проекта. Оказавшись там, создайте новый путь для своей библиотеки — /ThirdParty/YJMagicLib
В этот каталог мы добавим две новые папки — «Библиотеки» и «Включения» — для размещения соответствующих файлов. Включает в себя файлы заголовков, которые поставляются с вашей библиотекой и используются для определения API (интерфейс прикладного программирования), на который вы можете ссылаться в UE4. Вы должны скопировать файлы *.h в каталог «Включает», а файлы *.lib в каталог «Библиотеки». Здесь важно изменить имя вашей YJMagicLib.lib на YJMagicLib.x64.lib . Если только вы не получите сообщение «невозможно установить ссылку на YJMagicLib.x64.lib». ошибка.
Откройте свойства проекта и перейдите в раздел Свойства конфигурации -> Каталоги VC++. Добавьте ..\..\ThirdParty\YJMagicLib\Includes на вкладку "Включаемые каталоги".
Примечание. Это произвольный каталог. Важно только отметить его путь, чтобы вы могли позже сослаться на него в системе сборки.
Теперь мы перейдем к UnrealEngine и займемся привязкой нашей библиотеки к движку.
Расширение базового класса ModuleRules
Для тех, кто делает это более чем один раз, вы можете и, вероятно, должны добавить пару свойств в класс ModuleRules. Два свойства, которые я отмечу здесь, — это удобные свойства, гарантирующие, что мы всегда знаем, где находятся наши каталоги Module и ThirdParty. Эти два свойства будут использовать пространство имен System.IO для использования нескольких статических методов Path.
внутри /Source/UE4Magic/UE4Magic.Build.cs
Здесь, если вы не добавите использование System.IO; вы получите сообщение об ошибке «Путь не существует в текущем контексте». Не забудьте добавить!
Загрузка наших библиотек
Далее мы перейдем к конструктору модулей, где создадим новый метод, который будет вызываться для настройки системы сборки для загрузки наших библиотек.
внутри /Source/UE4Magic/UE4Magic.Build.cs
LoadYJMagicLib принимает объект TargetInfo, который содержит ряд элементов конфигурации для системы сборки, что позволяет настраивать сборку во время компиляции. Он передается, чтобы позволить нам загружать библиотеки для таргетинга на Windows, и может использоваться позже для таргетинга на другие платформы. Это также позволяет вам увидеть, на какие платформы нацелены — 64- или 32-битные, что очень важно для наших обстоятельств.Если вы помните, выше я упомянул, что мы будем ориентироваться на машины x64, но вы также можете использовать эту возможность для компиляции 32-битных (x86) библиотек.
Далее мы определим константу, которая будет передаваться с именем библиотеки для связывания.
внутри /Source/UE4Magic/UE4Magic.Build.cs
Это исключительно простая установка, которая вряд ли будет представлять полностью кросс-платформенную сборку. Что мы сделали, так это создали константу WITH_YJ_MAGIC_LIB_BINDING, которая будет передаваться во время компиляции, для нее установлено значение 1 (или true).
Полный код нашего базового класса ModuleRules
Полный код нашего базового класса ModuleRules выглядит следующим образом:
На этом этапе мы позаботились обо всех преимуществах UE4. Теперь вы можете включить файлы заголовков и начать выполнение кода.
Создание класса библиотеки функций Blueprint
Теперь мы готовы использовать YJMagicLib и создать собственный узел схемы. Давайте создадим узел схемы, который выполняет простую операцию «сложения».
В браузере содержимого вашего редактора UE4 щелкните правой кнопкой мыши и создайте новый класс C++. Выберите родительский класс как Blueprint Function Library и назовите его YJLibrary. VS 2017 автоматически откроется, и появятся файлы YJLibrary.h и YJLibrary.cpp. Измените эти коды следующим образом:
внутри /Source/UE4Magic/YJLibrary.h
внутри /Source/UE4Magic/YJLibrary.cpp
Примечание. В этом разделе я ссылаюсь на это руководство.
Использование узла Blueprint в редакторе UE4
Открыть Редактор схем уровней . Щелкните правой кнопкой мыши и найдите YJLibrary. Появится узел AddFloats. Мы создадим простой план, который добавляет два числа с плавающей запятой при нажатии клавиши «А», и покажем результаты на экране игрового процесса. Соедините узлы, как показано на рисунке. В этом примере я задал 2.0 и 3.0 в качестве входных данных для узла AddFloats.
Скомпилируйте сценарий Level Blueprint и нажмите кнопку воспроизведения. Вы будете видеть 5.0 на экране всякий раз, когда нажимаете клавишу "A".
Вы завершили свое долгое путешествие. Поздравляем. С этого момента вы сможете добавлять любую стороннюю библиотеку в UE4 по своему усмотрению.
Использование библиотек, загруженных через vcpkg
Чтобы использовать библиотеку, которую вы загрузили с помощью диспетчера пакетов vcpkg, вы можете игнорировать приведенные ниже инструкции. Дополнительные сведения см. на странице vcpkg.io.
Использование статических библиотек
Если ваш проект статической библиотеки создается в том же решении:
Если статическая библиотека не является частью решения:
- Щелкните правой кнопкой мыши узел проекта приложения в обозревателе решений и выберите "Свойства".
- На странице свойств Каталоги VC++ добавьте путь к каталогу, содержащему файл LIB, в Пути к библиотеке. Затем добавьте путь к заголовочному файлу (файлам) библиотеки в каталоги включения.
- На странице свойств Linker > Input добавьте имя файла LIB в Дополнительные зависимости.
Библиотеки динамических ссылок
Если DLL создается как часть того же решения, что и приложение, выполните те же действия, что и для статической библиотеки.
Если библиотека DLL не является частью прикладного решения, вам потребуются: файл DLL, заголовки с прототипами для экспортируемых функций и классов и файл LIB, содержащий необходимую информацию о связывании.
- Скопируйте DLL в выходную папку вашего проекта или в другую папку по стандартному пути поиска Windows для DLL. Дополнительные сведения см. в разделе Порядок поиска в библиотеке динамической компоновки.
- Выполните шаги 1–3 для статических библиотек, чтобы указать пути к заголовкам и файлу LIB.
COM-объекты
Если вашему собственному приложению C++ необходимо использовать COM-объект, и этот объект зарегистрирован, все, что вам нужно сделать, — это вызвать CoCreateInstance и передать CLSID объекта. Система найдет его в реестре Windows и загрузит. Таким же образом проект C++/CLI может использовать COM-объект. Или он может использовать его, добавив ссылку на него из списка «Добавить ссылки» > COM и используя его через вызываемую оболочку времени выполнения.
Справочные свойства
Каждый вид ссылки имеет свойства. Вы можете просмотреть свойства, выбрав ссылку в обозревателе решений и нажав Alt + Enter, либо щелкнув правой кнопкой мыши и выбрав «Свойства». Некоторые свойства доступны только для чтения, а некоторые можно изменить. Однако обычно вам не нужно вручную изменять эти свойства.
Эталонные свойства ActiveX
Свойства ссылок ActiveX доступны только для ссылок на COM-компоненты. Эти свойства отображаются только при выборе COM-компонента на панели «Ссылки». Свойства нельзя изменить.
Управление полным путем
Отображает путь к каталогу элемента управления, на который указывает ссылка.
Управление GUID
Отображает GUID для элемента управления ActiveX.
Управление версией
Отображает версию указанного элемента управления ActiveX.
Введите имя библиотеки
Отображает имя указанной библиотеки типов.
Инструмент "Обертка"
Отображает инструмент, используемый для создания сборки взаимодействия из указанной библиотеки COM или элемента управления ActiveX.
Свойства ссылки на сборку (C++/CLI)
Относительный путь
Отображает относительный путь от каталога проекта до указанной сборки.
Создать свойства
Следующие свойства доступны для различных типов ссылок. Они позволяют указать, как строить со ссылками.
Копировать локально
Указывает, следует ли автоматически копировать указанную сборку в целевое расположение во время сборки.
Копировать локальные вспомогательные сборки (C++/CLI)
Указывает, следует ли автоматически копировать вспомогательные сборки указанной сборки в целевое расположение во время сборки. Используется только в том случае, если для параметра Копировать локальное задано значение true .
Вывод эталонной сборки
Указывает, что эта сборка используется в процессе сборки. Если true , сборка используется в командной строке компилятора во время сборки.
Свойства ссылок между проектами
Следующие свойства определяют связь между проектами из проекта, выбранного на панели ссылок, в другой проект в том же решении. Дополнительные сведения см. в разделе Управление ссылками в проекте.
Связать зависимости библиотеки
Если для этого свойства установлено значение True, система проектов связывает файлы LIB, созданные независимым проектом, с зависимым проектом. Как правило, вы указываете True.
Идентификатор проекта
Уникально идентифицирует независимый проект. Значением свойства является внутренний системный GUID, который нельзя изменить.
Использовать входные данные зависимостей библиотеки
Если для этого свойства задано значение False, система проектов не будет связывать файлы OBJ для библиотеки, создаваемой независимым проектом, с зависимым проектом. Вот почему это значение отключает добавочное связывание. Как правило, вы указываете False, потому что создание приложения может занять много времени, если есть много независимых проектов.
Имя сборки
Отображает имя сборки для указанной сборки.
Культура
Отображает язык и региональные параметры выбранной ссылки.
Описание
Отображает описание выбранной ссылки.
Полный путь
Отображает путь к каталогу указанной сборки.
Идентификация
Ярлык
Отображает метку ссылки.
Имя
Отображает название ссылки.
Токен открытого ключа
Отображает токен открытого ключа, используемый для идентификации сборки, на которую указывает ссылка.
Сильное имя
true, если указанная сборка имеет строгое имя. Сборка со строгим именем имеет уникальную версию.
Статическая библиотека — это просто файл, содержащий функции, которые можно сделать доступными для других программ. Статические библиотеки заканчиваются расширением .lib и становятся доступными для других проектов Visual Studio (консольных приложений, приложений MFC и т. д.) путем создания ссылок на них. Пожалуйста, следуйте шагам, описанным ниже, чтобы создать и использовать свои собственные статические библиотеки.
1. Создайте приложение статической библиотеки в Visual Studio
В этом примере я использую Visual Studio 2003, но эти инструкции в равной степени применимы и к другим версиям Visual Studio.
В меню «Файл» > «Создать» > «Проект» выберите «Проект Win32». Дайте ему имя (в данном примере «StaticLib») и установите флажок «Создать каталог для решения»:
В появившемся мастере приложений Win32 выберите переключатель "Статическая библиотека" и установите флажок "Предварительно скомпилированный заголовок":
<р>2. Создайте заголовочные файлы для проекта статической библиотеки
Выберите «Проект» > «Добавить новый элемент».
Выберите файл заголовка (.h) и дайте ему имя (MyFunction.h):
В качестве примера вставьте в файл заголовка следующий код:
Вставьте следующий код в файл заголовка:
<р>3. Добавьте исходный код для файла заголовкаВ этом случае добавьте файл MyFunction.cpp, выбрав Добавить новый элемент > Файл C++ (.cpp):
А затем добавьте исходный код в MyFunction.cpp:
<р>4. Создайте статическую библиотекуСоздайте проект статической библиотеки, выбрав Build -> Build MyFunction.
Это создаст файл .lib, возможно, в папках Debug/Release, который вы впоследствии будете использовать.
<р>5. Используйте свою статическую библиотекуЗакройте проект статической библиотеки, над которым вы работаете, и создайте новое консольное приложение, например UseStaticLib:
Затем в настройках приложения нажмите переключатель «Консольное приложение» и установите флажок «Пустой проект»:
Создайте новый исходный файл C++ для консольного приложения (Проект > Добавить новый элемент… > Файл C++ (.cpp)) и назовите его UseMyFunction, например:
Теперь откройте проводник Windows.
Найдите папку, содержащую проект для файла статической библиотеки, который вы создали в результате сборки предыдущего проекта Visual Studio:
Обратите внимание, что эта папка содержит недавно созданный UseMyFunction.cpp.
Также из проекта StaticLib скопируйте созданный файл заголовка MyFunction.h и вставьте его в ту же папку проекта UseStaticLib:
<р>6. Добавьте статическую библиотеку в приложение, которое будет ее использовать
Перейдите в открытое консольное приложение Visual Studio и добавьте библиотеку в текущий проект.
Добавьте в проект файл StaticLib.lib.
В меню «Проект» > «Свойства» > «Компоновщик» > «Ввод» задайте для параметра «Дополнительные зависимости» значение nbame имени файла статической библиотеки:
Изготовление колес — интересная вещь. Vs — это мощный инструмент, который может подходить для крупномасштабных проектов, но, если серьезно, он не так удобен для настройки менее крупных проектов (другие руководства в Интернете вообще не подходят). Вот правильная поза для создания простой статической библиотеки. (кстати, научите меня немного правде
Создайте решение — многие люди не знают разницы между проектом/проектом и решением-решением. В VS проект является основной исполнительной единицей. Решение может содержать несколько проектов — наша статическая библиотека будет содержать несколько (.LIB) проектов и один (.Exe) проект для тестирования. Решение — консольное приложение Win32.
Выберите статическую библиотеку в качестве типа и удалите параметр предварительно скомпилированного заголовка.
Добавить заголовочные и исходные файлы.
То же самое относится и к исходному файлу. CPP, который должен выглядеть следующим образом:
(обратите внимание, что добавления только файлов .H без .CPP недостаточно. Такой проект не может скомпилировать библиотеку .lib, и тогда вы будете сообщать об ошибках типа «XXX.lib»: не удается открыть файл, указанный «при тестировании . Не спрашивайте меня, откуда я знаю или z)
(еще одна причина возврата к невозможности открыть указанный файл заключается в том, что Lib создается в неправильном месте. Здесь см. Обозреватель решений – > страница свойств свойств
->Каталог вывода направления вывода
По умолчанию правильно (в каталоге \debug, кто знает, как ошибиться)
Тогда вы можете написать код:
Затем вам нужен проект для тестирования (вспомните, что я сказал в начале, решение может иметь несколько проектов, каждый из которых является исполняющим блоком (о том, как вызывать исполнительные блоки, я расскажу позже, это моя собственная концепция) ). Добавьте новый проект в решение в обозревателе решений:
Выберите консоль и удалите предварительно скомпилированный заголовок, как и раньше. Теперь у нас есть решение, содержащее два проекта:
Напишите тестовый код
Vs любезно перечисляет проекты в решении в качестве альтернативы, и вы можете выбрать их.
На данный момент проект mathlib находится в тестовой ссылке.
Далее добавьте путь включения компилятора CL, то есть как найти mathlib. H в предкомпиляционном периоде завершить введение символов. На странице свойств свойств теста — > C++ > General — > дополнительные включаемые каталоги, т. е. каталоги, содержащиеся в других (настраиваемых) заголовочных файлах, которые являются дополнительными к каталогу заголовочных файлов стандартной библиотеки. CL следует отправиться в эти места, чтобы найти mathlib. H. Выберите каталог mystaticlibrary\mathlib и нажмите OK.
На данный момент все готово. Результаты настройки и работы F5 сообщают о такой ошибке:
Скажи. Lib не является допустимым приложением Win32 и не может быть запущен. Да, я не хотел его запускать, но откуда vs знает, какой из стольких проектов в солюшне должен запускаться? (подумайте о том, что означает предыдущая исполнительная единица. Скомпилированные результаты каждого проекта считаются исполняемыми.) Первый добавленный проект — это mathlib, поэтому vs запускает свой вывод по умолчанию, так что это неправильно. Попробуй для руководства vs запустить вывод теста (test.exe). Обозреватель решений – > страница свойств свойств mystaticlibrary:
Установите один запускаемый проект в качестве тестового, ОК.
Желаю всем счастливого дня!
Выше приведено полное содержание этой статьи. Я надеюсь, что это будет полезно для вашего исследования, и я надеюсь, что вы можете поддержать developmentpaer.
Читайте также: