3

VisualC++で静的ライブラリとしてBotanをコンパイルすることに非常に失敗しました。build.hファイルには、次のコードが含まれています。

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

このマクロは、次のように、Botanコードベースのほぼすべての場所に表示されます。

class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator

前の質問からの私の理解は、あなたがする必要があるのは値なしでBOTAN_DLLを定義することだけであり、それは静的ライブラリとしてうまくコンパイルされるべきであるということです。ただし、そうすると、「タグ名がありません」などのビルドエラーの膨大なリストが発生します。誰もがこれを行う方法を知っていますか?

編集:これは、makefileに/D"BOTAN_DLL"を追加した結果として生じるエラーのサンプルです。

        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
4

3 に答える 3

4

最近、静的Botanライブラリを自分で作成する必要がありました。これはかなり古いスレッドですが、回答を投稿すると思いました。これを行う「意図された」方法は、構成オプションを使用することだと思います。指定した場合

configure.py --disable-shared

次に、生成されたmakefileは、.dllの代わりに静的botan.libを構築します。また、を含むbuild.hを生成します

#ifndef BOTAN_DLL
  #define BOTAN_DLL 
#endif
于 2011-06-27T20:44:59.680 に答える
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 ディレクティブと定義しているプリプロセッサシンボルの値の間に誤ったスペースがあると思います。これである必要があります:

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 { ...
于 2009-06-15T10:04:49.283 に答える
0

__declspec(dllexport)は、静的ライブラリとしてのコンパイルとは何の関係もありません。特定の機能をエクスポートするようにリンカーに通知するだけです。リンカに静的ライブラリを構築するように指示するには、静的ライブラリ(lib)をで指定する必要があります。

構成タイプ| 一般| 構成タイプ

プロジェクトのプロパティダイアログで。この特定の構成がdllとしてビルドされる場合、構成タイプの変更によってエラーが発生することはありません。

于 2009-06-15T10:06:58.123 に答える