【问题标题】:How to compile the Botan crypto library as a static lib in VC++?如何在 VC++ 中将 Botan 加密库编译为静态库?
【发布时间】:2009-06-15 09:48:28
【问题描述】:

我在将 Botan 编译为 Visual C++ 中的静态库方面非常不成功。 build.h 文件包含以下代码:

#ifndef BOTAN_DLL
  #define BOTAN_DLL __declspec(dllexport)
#endif

这个宏随后会在 Botan 代码库中的几乎所有地方出现,如下所示:

class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator

我从previous question 的理解是,您需要做的就是定义没有值的 BOTAN_DLL,它应该可以编译为静态库。但是,这样做会导致大量构建错误,例如“缺少标签名称”。有人知道怎么做吗?

编辑:以下是将 /D "BOTAN_DLL" 添加到 makefile 导致的错误示例:

        cl.exe /Ibuild\include /O2  /EHsc /GR /D_CONSOLE /D "BOTAN_DLL"  /nologo
 /c src\checksum\adler32\adler32.cpp /Fobuild\lib\adler32.obj
adler32.cpp
build\include\botan/allocate.h(19) : error C2332: 'class' : missing tag name
build\include\botan/allocate.h(19) : error C2143: syntax error : missing ';' bef
ore 'constant'
build\include\botan/allocate.h(19) : error C2059: syntax error : 'constant'
build\include\botan/allocate.h(20) : error C2143: syntax error : missing ';' bef
ore '{'
build\include\botan/allocate.h(20) : error C2447: '{' : missing function header
(old-style formal list?)
build\include\botan/secmem.h(229) : error C2143: syntax error : missing ';' befo
re '*'
        build\include\botan/secmem.h(230) : see reference to class template inst
antiation 'Botan::MemoryRegion<T>' being compiled
build\include\botan/secmem.h(229) : error C4430: missing type specifier - int as
sumed. Note: C++ does not support default-int

【问题讨论】:

  • 能否请您引用一些无法编译且 BOTAN_DLL 定义为空字符串的源代码?

标签: c++ visual-c++ cryptography botan


【解决方案1】:

我最近需要自己构建一个静态 Botan 库,虽然这是一个相当老的线程,但我想我会发布一个答案。我相信这样做的“预期”方法是使用配置选项。如果你指定

configure.py --disable-shared

然后生成的 makefile 构建静态 botan.lib 而不是 .dll。它还生成包含

的 build.h
#ifndef BOTAN_DLL
  #define BOTAN_DLL 
#endif

【讨论】:

  • 这正是我需要做的。
【解决方案2】:

您收到的前几条错误消息是什么?也许你忘记了头文件包含?

看起来你的编译命令可能是错误的:

cl.exe /Ibuild\include /O2  /EHsc /GR /D_CONSOLE /D "BOTAN_DLL"  /nologo
 /c src\checksum\adler32\adler32.cpp /Fobuild\lib\adler32.obj

我认为您在 /D directive 和您定义的预处理器符号的值之间有一个错误的空格。应该是这样的:

cl.exe /Ibuild\include /O2  /EHsc /GR /D_CONSOLE /DBOTAN_DLL=  /nologo
 /c src\checksum\adler32\adler32.cpp /Fobuild\lib\adler32.obj

编辑:如果你有/DBOTAN_DLL,这相当于/DBOTAN_DLL=1,你想使用/DBOTAN_DLL=,这将给它没有关联的值。有了这个/DBOTAN_DLL,它作为值1插入到你的代码中,编译器会看到错误:

class 1 Allocator { ...

【讨论】:

  • 这里 allocate.h 的第 19 行是什么? build\include\botan/allocate.h(19):错误 C2332:'class':缺少标签名称
  • 简单的类定义,如原帖:class BOTAN_DLL Allocator
  • 无论我放 /D "BOTAN_DLL" 还是 /DBOTAN_DLL 似乎都没有区别,出现了相同的错误列表。
  • 抱歉,我弄错了 - 你需要有 /DBOTAN_DLL=(注意“=”符号)
  • 谢谢,这次它编译了,但是我是否需要将此预处理器定义添加到正在使用该库的 VC++ 项目中?在该项目中简单地添加“#define BOTAN_DLL”似乎不起作用。
【解决方案3】:

__declspec(dllexport) 与编译为静态库没有任何关系。它只是向链接器发出信号以导出特定功能。要指示链接器构建静态库,您必须在

中指定静态库 (lib)

配置类型 |一般 |配置类型

在项目属性对话框中。如果此特定配置构建为配置类型的 dll 更改,则不应导致错误。

【讨论】:

  • 我实际上并没有在 VC++ 中构建库;它的构建过程太复杂了。我正在使用 Botan 的 configure.pl 生成的 makefile 使用 nmake 构建它,然后尝试将我的 VC++ 项目链接到它。
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多