Зачем указывать определенную библиотеку в Visual Studio, если известен путь к lib?

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 где хранились все эти библиотеки, почему бы просто не выбрать лучшего автоматически?

0

Решение

libhpdfsd.lib — это статическая библиотека. Статические библиотеки связываются во время сборки с помощью компоновщика.

libhpdfd.dll — это динамически связанная библиотека. В отличие от статической библиотеки, она не связана во время сборки. Вместо этого он загружается в память процесса явно во время выполнения с LoadLibrary и адреса его экспортируемых функций и переменных получаются с GetProcAddress. Это требует написания некоторого стандартного кода. Чтобы избежать этого, часто существует соответствующая статическая библиотека, называемая библиотека импорта, который автоматически делает это для вас. Это то, что libhpdfd.lib является.

libhpdfd.pdb — это файл базы данных программы. Используется отладчиком.

libhpdfd.exp — это файл экспорта. Это полезно, когда у вас есть циклические зависимости.

libhpdfd.ilk — этот файл для инкрементное связывание. Инкрементное связывание ускоряет фазу связывания, что полезно, когда во время отладки вы вносите небольшие изменения в свой код и перестраиваете весь проект.

Вам необходимо явно указать библиотеку, которую вы используете, потому что у вас могут быть разные библиотеки или разные версии одной и той же библиотеки, которые экспортируют символы с одинаковым именем. В этом случае компоновщик не может знать, из какой библиотеки должен быть импортирован ваш символ, и вы получите ошибку компоновщика. Я считаю, что ошибка, которую вы получили, когда вы добавили libhpdfsd.lib чтобы дополнительные зависимости были из-за этого.

Использовать ли статическую библиотеку или DLL зависит от вас. Ваш выбор по умолчанию — использовать статическую библиотеку, при необходимости используйте dll.

2

Другие решения

В Visual Studio существует два типа файлов lib: первый — это статическая библиотека, а второй — содержит только символы для сопоставления с DLL. Если вы решите построить свой проект с использованием динамических библиотек, VS будет ожидать, что указан второй тип lib, так как он не может отличить их от имени файла и наоборот для построения статически связанных проектов.

0

По вопросам рекламы [email protected]