如何在VC中将Botan加密库编译为静态库?
我在 Visual C++ 中将 Botan 编译为静态库非常不成功。 build.h 文件包含以下代码:
#ifndef BOTAN_DLL
#define BOTAN_DLL __declspec(dllexport)
#endif
然后,该宏几乎出现在 Botan 代码库中的任何地方,如下所示:
class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator
我的理解来自 上一个问题是,您所需要做的就是定义不带值的 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
I've been extremely unsuccessful in compiling Botan as a static library in Visual C++. The build.h file contains the following code:
#ifndef BOTAN_DLL
#define BOTAN_DLL __declspec(dllexport)
#endif
This macro then shows up pretty much everywhere in the Botan codebase, like this:
class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator
My understanding from a previous question is that all you need to do is define BOTAN_DLL without a value and it should compile as a static library just fine. However, doing so causes a huge list of build errors like "missing tag name." Anyone know how to do this?
EDIT: Here is a sample of the errors that result from adding /D "BOTAN_DLL" to the 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我最近需要自己构建一个静态 Botan 库,虽然这是一个相当旧的线程,但我想我会发布一个答案。 我相信“预期”的方法是使用配置选项。 如果您指定
,则生成的 makefile 将构建静态 botan.lib 而不是 .dll。 它还生成包含
I recently had the need to build a static Botan library myself, and though this is a rather old thread, I thought I would post an answer. I believe the "intended" way to do this is using a configuration option. If you specify
then the generated makefile builds a static botan.lib instead of a .dll. It also generates build.h containing
您收到的前几条错误消息是什么? 也许您忘记了头文件包含?
看来您的编译命令可能是错误的:
我认为您在
/D
指令 以及您定义的预处理器符号的值。 应该是这样的:编辑:如果你有
/DBOTAN_DLL
,这相当于/DBOTAN_DLL=1
,你想使用/DBOTAN_DLL=
这不会给它带来任何关联的价值。 使用此/DBOTAN_DLL
,它将作为值 1 插入到您的代码中,并且编译器会看到错误:What are the first few error messages you get? Maybe you have forgotten a header file include?
It looks like maybe your compilation command is wrong:
I think you incorrectly have a space between the
/D
directive and the value of the preprocessor symbol you are defining. It should be this:EDIT: if you have
/DBOTAN_DLL
, this is equivalent to/DBOTAN_DLL=1
, you want to use/DBOTAN_DLL=
which will give it no associated value. With this/DBOTAN_DLL
, it is inserted into your code as the value 1, and the compiler sees the error:__declspec(dllexport) 与编译为静态库没有任何关系。 它只是向链接器发出信号以导出特定功能。 要指示链接器构建静态库,您必须在
配置类型 | 中指定静态库 (lib)。 一般| 配置类型
项目属性对话框中的 。 如果此特定配置构建为 dll,则配置类型的更改不应导致错误。
__declspec(dllexport) doesn't have anything to do with compiling as a static library. It just signals linker to export specific functionality. To instruct linker to build a static library you must specify Static Library (lib) in
Configuration Type | General | Configuration Type
in project properties dialog. If this particular configuration builds as a dll change of configuration type is not supposed to cause errors.