如何在VC ++中将Botan加密库编译为静态库?

时间:2009-06-15 09:48:29

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

我在将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

3 个答案:

答案 0 :(得分:4)

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

configure.py --disable-shared

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

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

答案 1 :(得分:0)

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

看起来你的编译命令可能不对:

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 { ...

答案 2 :(得分:0)

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

中指定静态库(lib)

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

项目属性对话框中的

。如果此特定配置构建为dll,则配置类型的更改不应导致错误。