Итак, я работаю над некоторыми библиотеками для C++, чтобы облегчить опыт новичков. Я поместил библиотеки в отдельную dll, и теперь я хочу добавить ее в другой проект. Но дело в том, что после поиска в Интернете целую вечность, у меня должны быть каталоги и прочее, но все, что я хочу, это включить в проект один DLL-файл, чтобы проект мог получить доступ к файлам .h и .cpp внутри. Ik я могу просто добавить внешний jar с java, тогда я могу получить доступ к библиотекам там, но как это сделать с помощью C++ в visual studio 2015?visual studio 2015 C++ добавить автономный DLL-файл в проект
ответ
Как вы это делаете, как Java? Ну, нет.
Заголовок должен содержать компилятор с прототипами функций и других символов, которые экспортируются из библиотеки DLL, которые вы, возможно, захотите использовать. Вы можете даже иметь несколько файлов заголовков для логического разделения кода вашей DLL. И поскольку вы не захотите жестко закодировать путь к этим заголовочным файлам в исходном коде, вам нужно указать путь к его содержащему директорию как часть ваших параметров компилятора/сборки, освободив вас от использования относительных путей.
Файл LIB, как правило, также требуется, хотя это немного более гибко. Как правило, LIB упрощает работу. Он будет сгенерирован компоновщиком при компиляции DLL, и он содержит заглушки, которые облегчают привязку к функциям, экспортированным этой DLL. Вы указываете этот файл LIB в настройках компоновщика при создании приложения, использующего DLL, и все просто работает. Это называется неявным динамическим связыванием. Это динамическая связь, потому что вы используете DLL, но это подразумевается, потому что компоновщик обрабатывает грязную работу для вас.
Если вы не хотите использовать файл LIB, вам нужно будет сделать явно динамическое соединение. Это все еще динамическое связывание, потому что вы все еще используете DLL, но оно явственно, потому что вы должны явно писать код для загрузки DLL-модуля и получения указателей на функции, которые он экспортирует. Инструменты сборки Microsoft предоставляют различные функции, чтобы сделать это проще, но это еще сложнее, чем просто использовать файл LIB, и это то, что я бы рекомендовал, если у вас нет веских оснований для этого.
Это не то, как работает C++ (я предполагаю, что вы не говорите о C++/CX или MC++ - которые, строго говоря, являются не C++)
Язык C++ не определяет «Application Binary Interface "- ABI, который позволяет связывать между двоичными файлами. Это проблема реализации.
ABI, которые поддерживают C++, такие как COM и CORBA, действительно самый последний из них - это WinRT - сам на основе COM.
C++ отличается от языков, таких как Java и C#, которые предписывают время выполнения, который действительно имеет ABI: Java имеет свои .class
и .jar
файлов при .NET/C# имеют CLR метаданные, содержащиеся в его сборке (.dll
файлов - которые не являются то же самое, что и «реальные» DLL-файлы).
Обратите внимание, что DLL-файлы, сгенерированные компилятором C#, не похожи на файлы DLL, созданные вашим компоновщиком компоновщика C/C++ компилятора - в то время как они имеют общий внешний формат в виде файлов PE (Portable Executable), внутри они радикально различаются: CLR DLL содержат CIL, промежуточный байт-код, тогда как «реальные» DLL-файлы содержат собственные инструкции, специфичные для процессора.
Общий способ работы с другими библиотеками в C++ является либо использовать их в исходной-форме (как .c
и .cpp
файлов, включенных в проекте), или как .h
файлов заголовки с .lib
(статическими библиотеками), которые почти одинаковы для повторного использования двоичных файлов, за исключением того, что они связаны («скомпилированы в и объединены с») в ваш готовый двоичный файл и не могут быть заменены во время выполнения.
Другим способом является динамическое связывание, для которого требуется время выполнения (то есть Win32), связанное с временем выполнения, обычно с GetProcAddress
- но это только экспорт функций C-стиля, а не целых объектов и классов (и, C++).
В итоге:
- У вас есть DLL, и вы хотите использовать код внутри него:
- ли это WinRT DLL?
- Если вы хотите использовать чистый C++, вам необходимо использовать WTL. Beware, this approach is not for the faint-hearted.
- Else, если вы в порядке с C++/CX, тогда вы действительно можете использовать интерфейс «Добавить ссылку» в Visual Studio, но будьте уверены, вы больше не пишете «настоящий» C++.
- Else это библиотека COM?
- (Обратите внимание, что вам понадобится ATL (Active Template Library) и определения IDL типов, содержащихся внутри, это COM-эквивалент файла заголовка). Вы также можете использовать
#import
и/или использовать IDE для генерации фактических.h
и.c
файлов, необходимых для вызова COM без особых проблем. Однако вы столкнетесь с проблемами, если позже замените COM-DLL, не перестраивая свою программу, если слишком много вещей было изменено в более поздней версии COM DLL (см. «DLL Hell»).
- (Обратите внимание, что вам понадобится ATL (Active Template Library) и определения IDL типов, содержащихся внутри, это COM-эквивалент файла заголовка). Вы также можете использовать
- Else - традиционная родная DLL-библиотека Win32 PE?
- Весь исполняемый файл PE имеет список экспортируемых функций и их адреса в DLL.
- Вы хотите установить статическое связывание или динамическое связывание?
- Для динамического связывания вам нужно разрешение времени выполнения (болезненное, но гибкое) или «автоматическое» соединение?
- Для ссылки на время работы вам нужен только файл
.dll
и.h
. Вам нужно будет вручную вызватьGetProcAddress
для каждой функции, которую вы хотите вызвать, а затем вызвать ее. Преимущество заключается в том, что вы можете обнаружить во время выполнения, если функция существует и изящно обрабатывать ошибки связывания. - Для автоматического связывания вы получите
.lib
файл в дополнении к.dll
и.h
файлам, файл.lib
небольшой статический подключаемая библиотека, которая содержит окурки и другой код, необходимые для осуществления выполнения связывания для вас без необходимости вручную позвоните по телефонуGetProcAddress
.
- Для ссылки на время работы вам нужен только файл
- Для статической линковки вы не будете иметь
.dll
файл, но.lib
файл: известный как «статической библиотеки». Внутри это файл, содержащий дискретные исполняемые функции blob, которые ваш компоновщик будет эффективно копировать + вставлять в вашу завершенную программу.
- Для динамического связывания вам нужно разрешение времени выполнения (болезненное, но гибкое) или «автоматическое» соединение?
- ли это WinRT DLL?