TL / DR: Вопрос начинается с шагов, которые я сделал, и которые я считаю важным упомянуть (дайте мне знать, если это не важно, и я удалю его). Сам вопрос находится внизу страницы. Я опубликовал 3 вопроса с теми же шагами, которые я выполнил, прежде чем задавать вопрос, однако вопросы разные. Спасибо
Я успешно скомпилировал libharu библиотека с cmake, так что я могу использовать ее в своем собственном проекте c ++ для создания PDF-файлов. Он был скомпилирован с Visual Studio 2013 как Debug / Win32. cmake-gui был установлен следующим образом:
Sources:
c:\Users\wakatana\Downloads\__c++_pdf__generation\libharu-RELEASE_2_3_0
Build:
C:\Users\wakatana\Downloads\__c++_pdf__generation\libharu-build32
Мой текущий проект (созданный с нуля), который я использую libharu имеет следующую структуру (снова Visual Studio 2013):
./Debug
./libharu_example
./libharu_example/Debug
./libharu_example/Debug/libharu_example.tlog
./libharu_example/libharu
./libharu_example/libharu/include
./libharu_example/libharu/lib
./libharu_example/libharu/src
./libharu_example/libharu/src/CMakeFiles
libharu/include
содержит файлы из C:\Users\wakatana\Downloads\__c++_pdf__generation\libharu-RELEASE_2_3_0\include
libharu/src
содержит файлы из C:\Users\wakatana\Downloads\__c++_pdf__generation\libharu-RELEASE_2_3_0\src
libharu/lib
содержит файлы из C:\Users\wakatana\Downloads\__c++_pdf__generation\libharu-build32\src\Debug
Настройки проекта Visual Studio следующие:
# C/C++ -> General -> Additional Include Directories:
$(ProjectDir)libharu\include
# C/C++ -> Preprocessor -> Preprocessor Definitions:
_CRT_SECURE_NO_WARNINGS
# Linker -> General -> Additional Library Directories
$(ProjectDir)libharu\lib
# Linker -> Input -> Additional Dependencies
libhpdfd.lib
Внутри основного файла я включаю libharu сюда:
#include "libharu/include/hpdf.h"
Напоследок на вопрос:
в C:\Users\wakatana\Downloads\__c++_pdf__generation\libharu-build32\src\Debug
В каталоге есть также такие файлы:
libhpdfd.dll
libhpdfd.exp
libhpdfd.ilk
libhpdfd.lib
libhpdfd.pdb
libhpdfsd.lib
Я пытался установить Linker -> Input -> Additional Dependencies
также к libhpdfsd.lib
а также libhpdfd.dll
но единственный, который работал libhpdfd.lib
, Какова цель других вышеупомянутых файлов и как я знаю, какой * .lib * .dll мне следует использовать? Также, почему мне нужно указать это в Visual Studio? Разве это не достаточно умно, чтобы он мог загрузить его автоматически? Уже уточнил $(ProjectDir)libharu\lib
где хранились все эти библиотеки, почему бы просто не выбрать лучшего автоматически?
libhpdfsd.lib
— это статическая библиотека. Статические библиотеки связываются во время сборки с помощью компоновщика.
libhpdfd.dll
— это динамически связанная библиотека. В отличие от статической библиотеки, она не связана во время сборки. Вместо этого он загружается в память процесса явно во время выполнения с LoadLibrary и адреса его экспортируемых функций и переменных получаются с GetProcAddress. Это требует написания некоторого стандартного кода. Чтобы избежать этого, часто существует соответствующая статическая библиотека, называемая библиотека импорта, который автоматически делает это для вас. Это то, что libhpdfd.lib
является.
libhpdfd.pdb
— это файл базы данных программы. Используется отладчиком.
libhpdfd.exp
— это файл экспорта. Это полезно, когда у вас есть циклические зависимости.
libhpdfd.ilk
— этот файл для инкрементное связывание. Инкрементное связывание ускоряет фазу связывания, что полезно, когда во время отладки вы вносите небольшие изменения в свой код и перестраиваете весь проект.
Вам необходимо явно указать библиотеку, которую вы используете, потому что у вас могут быть разные библиотеки или разные версии одной и той же библиотеки, которые экспортируют символы с одинаковым именем. В этом случае компоновщик не может знать, из какой библиотеки должен быть импортирован ваш символ, и вы получите ошибку компоновщика. Я считаю, что ошибка, которую вы получили, когда вы добавили libhpdfsd.lib
чтобы дополнительные зависимости были из-за этого.
Использовать ли статическую библиотеку или DLL зависит от вас. Ваш выбор по умолчанию — использовать статическую библиотеку, при необходимости используйте dll.
В Visual Studio существует два типа файлов lib: первый — это статическая библиотека, а второй — содержит только символы для сопоставления с DLL. Если вы решите построить свой проект с использованием динамических библиотек, VS будет ожидать, что указан второй тип lib, так как он не может отличить их от имени файла и наоборот для построения статически связанных проектов.