如果 lib 的路径已知,为什么要在 Visual Studio 中指定特定的库?
Why specify particular library in Visual Studio if the path to lib is known?
TL/DR:问题从我所做的步骤开始,我认为值得一提(如果不重要请告诉我,我会删除它)。问题本身在页面底部。我已经发布了 3 个问题,这些问题的步骤与我在提出问题之前发布的步骤相同,但问题有所不同。谢谢
我已经用 cmake 成功编译了 libharu 库,所以我可以在我自己的 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 and addresses of its exported functions and variables are obtained with GetProcAddress 显式加载到进程内存中。这需要编写一些样板代码。为了避免这样做,通常有一个相应的静态库,称为 import library,它会自动为您执行此操作。这就是 libhpdfd.lib
的意思。
libhpdfd.pdb
- 这是一个程序数据库文件。它被调试器使用。
libhpdfd.exp
- 这是一个导出文件。当你有循环依赖时它很有用。
libhpdfd.ilk
- 此文件用于增量链接。增量链接可加快链接阶段的速度,这在调试期间对代码进行少量更改并重建所有项目时非常有用。
您需要明确指定您使用的库,因为您可能有不同的库或同一库的不同版本,它们导出具有相同名称的符号。在那种情况下,链接器无法知道应该从哪个库中导入符号,并且会出现链接器错误。我相信将 libhpdfsd.lib
添加到其他依赖项时出现的错误是因为这个。
使用静态库还是dll,由你决定。您的默认选择是使用静态库,必要时使用 dll。
在visual studio中有两种类型的lib文件,第一种是静态库,第二种lib只包含与DLL映射的符号。如果您选择使用动态库构建项目,VS 将期望指定第二种类型的库,因为它无法通过文件名区分这两种类型,反之亦然以构建静态链接项目。
TL/DR:问题从我所做的步骤开始,我认为值得一提(如果不重要请告诉我,我会删除它)。问题本身在页面底部。我已经发布了 3 个问题,这些问题的步骤与我在提出问题之前发布的步骤相同,但问题有所不同。谢谢
我已经用 cmake 成功编译了 libharu 库,所以我可以在我自己的 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 and addresses of its exported functions and variables are obtained with GetProcAddress 显式加载到进程内存中。这需要编写一些样板代码。为了避免这样做,通常有一个相应的静态库,称为 import library,它会自动为您执行此操作。这就是 libhpdfd.lib
的意思。
libhpdfd.pdb
- 这是一个程序数据库文件。它被调试器使用。
libhpdfd.exp
- 这是一个导出文件。当你有循环依赖时它很有用。
libhpdfd.ilk
- 此文件用于增量链接。增量链接可加快链接阶段的速度,这在调试期间对代码进行少量更改并重建所有项目时非常有用。
您需要明确指定您使用的库,因为您可能有不同的库或同一库的不同版本,它们导出具有相同名称的符号。在那种情况下,链接器无法知道应该从哪个库中导入符号,并且会出现链接器错误。我相信将 libhpdfsd.lib
添加到其他依赖项时出现的错误是因为这个。
使用静态库还是dll,由你决定。您的默认选择是使用静态库,必要时使用 dll。
在visual studio中有两种类型的lib文件,第一种是静态库,第二种lib只包含与DLL映射的符号。如果您选择使用动态库构建项目,VS 将期望指定第二种类型的库,因为它无法通过文件名区分这两种类型,反之亦然以构建静态链接项目。