0

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 Dependencieslibhpdfsd.liblibhpdfd.dll但唯一有效的是libhpdfd.lib. 上述其他文件的用途是什么?我如何知道应该使用哪个 *.lib *.dll?还有为什么我需要将此指定给 Visual Studio?难道它不够聪明,可以自动加载吗?它已经指定$(ProjectDir)libharu\lib了所有这些库的存储位置,为什么不自动选择最好的库呢?

4

2 回答 2

2

libhpdfsd.lib- 这是一个静态库。静态库在构建时由链接器链接。

libhpdfd.dll- 这是一个动态链接库。与静态库相比,它在构建时没有链接。相反,它在运行时使用LoadLibrary显式加载到进程内存中,并使用GetProcAddress获得其导出函数和变量的地址。这需要编写一些样板代码。为了避免这样做,通常有一个相应的静态库,称为import library,它会自动为您执行此操作。这就是事实libhpdfd.lib

libhpdfd.pdb- 这是一个程序数据库文件。它由调试器使用。

libhpdfd.exp- 这是一个导出文件。当您有循环依赖时,它很有用。

libhpdfd.ilk- 此文件用于增量链接。增量链接加快了链接阶段,这在调试期间对代码进行小的更改并重建所有项目时很有用。

您需要明确指定您使用的库,因为您可能有不同的库或同一库的不同版本,它们导出具有相同名称的符号。在这种情况下,链接器无法知道应该从哪个库中导入符号,并且会出现链接器错误。我相信您在添加libhpdfsd.lib其他依赖项时遇到的错误是因为这个。

是使用静态库还是 dll 取决于您。您的默认选择是使用静态库,必要时使用 dll。

于 2016-09-10T02:14:13.257 回答
0

在 Visual Studio 中有两种类型的 lib 文件,第一种是静态库,第二种 lib 仅包含用于与 DLL 映射的符号。如果您选择使用动态库构建项​​目,VS 将期望指定第二种类型的 lib,因为它无法将两者与文件名区分开来,反之亦然,用于构建静态链接的项目。

于 2016-09-10T03:15:39.370 回答