2009-06-15 5 views
3

저는 Visual C++에서 정적 라이브러리로 Botan을 컴파일하는 데있어 극도로 실패했습니다.VC++에서 Botan 암호화 라이브러리를 정적 라이브러리로 컴파일하는 방법은 무엇입니까?

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

이 다음이처럼 모란 코드베이스에 거의 모든 곳에서 나타 매크로 : :이 build.h 파일에는 다음 코드가 포함

class BOTAN_DLL AutoSeeded_RNG : public RandomNumberGenerator 

previous question에서 나의 이해는 당신이 모두 필요하다 해야 할 일은 값없이 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 
+0

빈 문자열로 정의 된 BOTAN_DLL로 컴파일에 실패한 소스를 인용 해주십시오. – sharptooth

답변

0

있습니다 : 여기에 메이크 파일에/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 

내가 잘못 /Ddirective 당신이 정의하는 전처리 심볼의 값 사이에 공백을 가지고 생각합니다.

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

물론 원본 게시물에 새로 추가 된 수정 사항을 참조하십시오. –

+0

여기서 allocate.h의 19 번째 라인에 무엇이 있습니까? build \ include \ botan/allocate.ht (19) : 오류 C2332 : 'class': 태그 이름이 누락되었습니다. –

+0

원래 게시와 마찬가지로 간단하게 클래스 정의입니다. class BOTAN_DLL 할당 자 –

0

__declspec (dllexport)는 정적 라이브러리로 컴파일 함께 할 아무것도하지 않습니다. 링커가 특정 기능을 내보내는 신호입니다. 링커에서 정적 라이브러리를 작성하도록 지정하려면 정적 라이브러리 (lib)를

에 지정해야합니다.

구성 유형 | 일반 | 프로젝트 등록 정보 대화 상자에서 구성 유형

. 구성 유형의 dll 변경으로 인해이 특정 구성이 빌드되면 오류가 발생하지 않습니다.

+0

VC++에서 실제로 라이브러리를 작성하지 않습니다. 빌드 프로세스가 너무 복잡합니다. Botake의 configure.pl에 의해 생성 된 makefile을 사용하여 nmake로 빌드하고, VC++ 프로젝트를 링크하려고합니다. –

4

저는 최근에 정적 Botan 라이브러리를 직접 만들어야 할 필요가있었습니다. 그리고 이것은 다소 오래된 스레드이지만, 나는 대답을 게시 할 것이라고 생각했습니다. 이 작업을 수행하는 "의도 된"방법은 구성 옵션을 사용하는 것입니다.

configure.py --disable-shared 

다음 생성 된 메이크 파일은 .dll 대신 정적 botan.lib를 작성합니다. 또한 포함 된 build.h를 생성합니다.

#ifndef BOTAN_DLL 
    #define BOTAN_DLL 
#endif 
+0

이것은 정확히 내가해야 할 일이다. –

관련 문제