2014-03-29 2 views
2

Android 용 Crypto ++ 라이브러리를 만들어야하는 특수한 GNUmakefile을 만드는 데 문제가 있습니다. 나는이 tutorial을 사용하고 있으며 makefile에 패치를 걸었습니다. 어디에서 GNUmakefile-android.patch 파일을 찾을 수 있습니까? 나는 수동으로 파일에 줄을 추가하는 tryied했지만 올바른 일을 확실하지 않습니다. 이제 내 GNUmakefile '은 찾지은 다음과 같습니다 :이 컴파일 Cygwin에서 사용하고Android Crypto ++ 명령 줄에서 컴파일, GNUmakefile

g++ -DNDEBUG -g -O2 -march=native -DCRYPTOPP_DISABLE_ASM -pipe -c shacal2.cpp 
In file included from cryptlib.h:83:0, 
       from seckey.h:8, 
       from shacal2.h:7, 
       from shacal2.cpp:9: 
stdcpp.h:9:20: fatal error: stddef.h: No such file or directory 
#include <stddef.h> 
        ^
compilation terminated. 
GNUmakefile:233: polecenia dla obiektu 'shacal2.o' nie powiodły się 
make: *** [shacal2.o] Błąd 1 

:

CXXFLAGS = -DNDEBUG -g -O2 
# -O3 fails to link on Cygwin GCC version 4.5.3 
# -fPIC is supported. Please report any breakage of -fPIC as a bug. 
# CXXFLAGS += -fPIC 
# the following options reduce code size, but breaks link or makes link very slow on some systems 
# CXXFLAGS += -ffunction-sections -fdata-sections 
# LDFLAGS += -Wl,--gc-sections 
ARFLAGS = -cr # ar needs the dash on OpenBSD 
RANLIB = ranlib 
CP = cp 
MKDIR = mkdir 
EGREP = egrep 
UNAME = $(shell uname) 
ISX86 = $(shell uname -m | $(EGREP) -c "i.86|x86|i86|amd64") 
IS_SUN_CC = $(shell $(CXX) -V 2>&1 | $(EGREP) -c "CC: Sun") 
IS_LINUX = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -c "linux") 
IS_MINGW = $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -c "mingw") 
CLANG_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang version") 

# Set in the environment 
ifeq ($(IS_CROSS_COMPILE),1) 
    ISX86=0 
    IS_LINUX=0 
    IS_MINGW=0 
    IS_DARWIN=0 
    UNAME=CrossCompile 
endif 

# Default prefix for make install 
ifeq ($(PREFIX),) 
PREFIX = /usr 
endif 

ifeq ($(CXX),gcc) # for some reason CXX is gcc on cygwin 1.1.4 
CXX = g++ 
endif 


ifeq ($(IS_ANDROID),1) 
    CPP=arm-linux-androideabi-cpp 
    CXX=arm-linux-androideabi-g++ 
    AR=arm-linux-androideabi-ar 
    RANLIB=arm-linux-androideabi-ranlib 
    LD=arm-linux-androideabi-ld 

    CXXFLAGS += -fPIC -DCRYPTOPP_DISABLE_ASM --sysroot=$(ANDROID_SYSROOT) -I$(ANDROID_STL_INC) 
    LDLIBS += $(ANDROID_STL_LIB) 
endif 

#if defined(__ANDROID__) 
# include <sys/select.h> 
#endif 

ifeq ($(ISX86),1) 

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") 
INTEL_COMPILER = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "\(ICC\)") 
ICC111_OR_LATER = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "\(ICC\) ([2-9][0-9]|1[2-9]|11\.[1-9])") 
GAS210_OR_LATER = $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.[1-9][0-9]|[3-9])") 
GAS217_OR_LATER = $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.1[7-9]|2\.[2-9]|[3-9])") 
GAS219_OR_LATER = $(shell $(CXX) -xc -c /dev/null -Wa,-v -o/dev/null 2>&1 | $(EGREP) -c "GNU assembler version (2\.19|2\.[2-9]|[3-9])") 

ifneq ($(GCC42_OR_LATER),0) 
ifeq ($(UNAME),Darwin) 
CXXFLAGS += -arch x86_64 -arch i386 
else 
CXXFLAGS += -march=native 
endif 
endif 

ifneq ($(INTEL_COMPILER),0) 
CXXFLAGS += -wd68 -wd186 -wd279 -wd327 
ifeq ($(ICC111_OR_LATER),0) 
# "internal error: backend signals" occurs on some x86 inline assembly with ICC 9 and some x64 inline assembly with ICC 11.0 
# if you want to use Crypto++'s assembly code with ICC, try enabling it on individual files 
CXXFLAGS += -DCRYPTOPP_DISABLE_ASM 
endif 
endif 

ifeq ($(GAS210_OR_LATER),0) # .intel_syntax wasn't supported until GNU assembler 2.10 
CXXFLAGS += -DCRYPTOPP_DISABLE_ASM 
else 
ifeq ($(GAS217_OR_LATER),0) 
CXXFLAGS += -DCRYPTOPP_DISABLE_SSSE3 
else 
ifeq ($(GAS219_OR_LATER),0) 
CXXFLAGS += -DCRYPTOPP_DISABLE_AESNI 
endif 
endif 
ifeq ($(UNAME),SunOS) 
CXXFLAGS += -Wa,--divide # allow use of "/" operator 
endif 
endif 

endif # ISX86 

ifeq ($(UNAME),) # for DJGPP, where uname doesn't exist 
CXXFLAGS += -mbnu210 
else 
CXXFLAGS += -pipe 
endif 

ifeq ($(IS_MINGW),1) 
LDLIBS += -lws2_32 
endif 

ifeq ($(IS_LINUX),1) 
LDFLAGS += -pthread 
ifneq ($(shell uname -i | $(EGREP) -c "(_64|d64)"),0) 
M32OR64 = -m64 
endif 
endif 

ifeq ($(UNAME),Darwin) 
AR = libtool 
ARFLAGS = -static -o 
CXX = c++ 
IS_GCC2 = $(shell $(CXX) -v 2>&1 | $(EGREP) -c gcc-932) 
ifeq ($(IS_GCC2),1) 
CXXFLAGS += -fno-coalesce-templates -fno-coalesce-static-vtables 
LDLIBS += -lstdc++ 
LDFLAGS += -flat_namespace -undefined suppress -m 
endif 
endif 

ifeq ($(UNAME),SunOS) 
LDLIBS += -lnsl -lsocket 
M32OR64 = -m$(shell isainfo -b) 
endif 

ifneq ($(CLANG_COMPILER),0) 
CXXFLAGS += -Wno-tautological-compare 
endif 

ifneq ($(IS_SUN_CC),0) # override flags for CC Sun C++ compiler 
CXXFLAGS = -DNDEBUG -O -g0 -native -template=no%extdef $(M32OR64) 
LDFLAGS = 
AR = $(CXX) 
ARFLAGS = -xar -o 
RANLIB = true 
SUN_CC10_BUGGY = $(shell $(CXX) -V 2>&1 | $(EGREP) -c "CC: Sun .* 5\.10 .* (2009|2010/0[1-4])") 
ifneq ($(SUN_CC10_BUGGY),0) 
# -DCRYPTOPP_INCLUDE_VECTOR_CC is needed for Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21 and was fixed in May 2010 
# remove it if you get "already had a body defined" errors in vector.cc 
CXXFLAGS += -DCRYPTOPP_INCLUDE_VECTOR_CC 
endif 
endif 

SRCS = $(wildcard *.cpp) 
ifeq ($(SRCS),)    # workaround wildcard function bug in GNU Make 3.77 
SRCS = $(shell echo *.cpp) 
endif 

OBJS = $(SRCS:.cpp=.o) 
# test.o needs to be after bench.o for cygwin 1.1.4 (possible ld bug?) 
TESTOBJS = bench.o bench2.o test.o validat1.o validat2.o validat3.o adhoc.o datatest.o regtest.o fipsalgt.o dlltest.o 
LIBOBJS = $(filter-out $(TESTOBJS),$(OBJS)) 

DLLSRCS = algebra.cpp algparam.cpp asn.cpp basecode.cpp cbcmac.cpp channels.cpp cryptlib.cpp des.cpp dessp.cpp dh.cpp dll.cpp dsa.cpp ec2n.cpp eccrypto.cpp ecp.cpp eprecomp.cpp files.cpp filters.cpp fips140.cpp fipstest.cpp gf2n.cpp gfpcrypt.cpp hex.cpp hmac.cpp integer.cpp iterhash.cpp misc.cpp modes.cpp modexppc.cpp mqueue.cpp nbtheory.cpp oaep.cpp osrng.cpp pch.cpp pkcspad.cpp pubkey.cpp queue.cpp randpool.cpp rdtables.cpp rijndael.cpp rng.cpp rsa.cpp sha.cpp simple.cpp skipjack.cpp strciphr.cpp trdlocal.cpp 
DLLOBJS = $(DLLSRCS:.cpp=.export.o) 
LIBIMPORTOBJS = $(LIBOBJS:.o=.import.o) 
TESTIMPORTOBJS = $(TESTOBJS:.o=.import.o) 
DLLTESTOBJS = dlltest.dllonly.o 

all: cryptest.exe 
static: libcryptopp.a 
dynamic: libcryptopp.so 

test: cryptest.exe 
    ./cryptest.exe v 

clean: 
    -$(RM) cryptest.exe libcryptopp.a libcryptopp.so $(LIBOBJS) $(TESTOBJS) cryptopp.dll libcryptopp.dll.a libcryptopp.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTI MPORTOBJS) $(DLLTESTOBJS) 

install: 
    $(MKDIR) -p $(PREFIX)/include/cryptopp $(PREFIX)/lib $(PREFIX)/bin 
    -$(CP) *.h $(PREFIX)/include/cryptopp 
    -$(CP) *.a $(PREFIX)/lib 
    -$(CP) *.so $(PREFIX)/lib 
    -$(CP) *.exe $(PREFIX)/bin 

remove: 
    -$(RM) -rf $(PREFIX)/include/cryptopp 
    -$(RM) $(PREFIX)/lib/libcryptopp.a 
    -$(RM) $(PREFIX)/lib/libcryptopp.so 
    -$(RM) $(PREFIX)/bin/cryptest.exe 

libcryptopp.a: $(LIBOBJS) 
    $(AR) $(ARFLAGS) [email protected] $(LIBOBJS) 
    $(RANLIB) [email protected] 

libcryptopp.so: $(LIBOBJS) 
    $(CXX) $(CXXFLAGS) -shared -o [email protected] $(LDFLAGS) $(LIBOBJS) 

cryptest.exe: libcryptopp.a $(TESTOBJS) 
    $(CXX) -o [email protected] $(CXXFLAGS) $(TESTOBJS) ./libcryptopp.a $(LDFLAGS) $(LDLIBS) 

nolib: $(OBJS)  # makes it faster to test changes 
    $(CXX) -o ct $(CXXFLAGS) $(OBJS) $(LDFLAGS) $(LDLIBS) 

dll: cryptest.import.exe dlltest.exe 

cryptopp.dll: $(DLLOBJS) 
    $(CXX) -shared -o [email protected] $(CXXFLAGS) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcryptopp.dll.a 

libcryptopp.import.a: $(LIBIMPORTOBJS) 
    $(AR) $(ARFLAGS) [email protected] $(LIBIMPORTOBJS) 
    $(RANLIB) [email protected] 

cryptest.import.exe: cryptopp.dll libcryptopp.import.a $(TESTIMPORTOBJS) 
    $(CXX) -o [email protected] $(CXXFLAGS) $(TESTIMPORTOBJS) -L. -lcryptopp.dll -lcryptopp.import $(LDFLAGS) $(LDLIBS) 

dlltest.exe: cryptopp.dll $(DLLTESTOBJS) 
    $(CXX) -o [email protected] $(CXXFLAGS) $(DLLTESTOBJS) -L. -lcryptopp.dll $(LDFLAGS) $(LDLIBS) 

adhoc.cpp: adhoc.cpp.proto 
ifeq ($(wildcard adhoc.cpp),) 
    cp adhoc.cpp.proto adhoc.cpp 
else 
    touch adhoc.cpp 
endif 

%.dllonly.o : %.cpp 
    $(CXX) $(CXXFLAGS) -DCRYPTOPP_DLL_ONLY -c $< -o [email protected] 

%.import.o : %.cpp 
    $(CXX) $(CXXFLAGS) -DCRYPTOPP_IMPORTS -c $< -o [email protected] 

%.export.o : %.cpp 
    $(CXX) $(CXXFLAGS) -DCRYPTOPP_EXPORTS -c $< -o [email protected] 

%.o : %.cpp 
    $(CXX) $(CXXFLAGS) -c $< 

내가 명령을 실행

내가이 오류'정적, 동적 cryptest.exe을 '. 나는 도움에 감사 할 것입니다.

+0

당신은 어떻게 이것으로 만들었습니까? – jww

+0

나는 Crypto ++ makefile을보고 있었고 Cygwin에서 정의한 것을 보지 못했다. (그러나 나는 명백한 것을 놓쳤을 것이다.) Cygwin에서 자체를 구별하기 위해 설정 한 선처리 매크로는 무엇입니까? – jww

답변

1

Where can I find file GNUmakefile-android.patch which there is mentioned?

다운로드는 페이지 하단에 있습니다.


Now my GNUmakefile looks like this:

> # Set in the environment 
> ifeq ($(IS_CROSS_COMPILE),1) 
> ISX86=0 
> IS_LINUX=0 
> IS_MINGW=0 
> IS_DARWIN=0 
> UNAME=CrossCompile 
> endif 

이 메이크 파일에 사용되는 "호스트"플래그 설정을 해제

. 그렇지 않으면 Crypto ++이 대상 (즉, Android 기기)이 아닌 호스트 (즉, 데스크톱 컴퓨터)에 대해 CXXFLAGS을 설정합니다.

다음으로 대상에 CXXFLAGS이 필요합니다. 동일한 튜토리얼 :

ifeq ($(IS_ANDROID),1) 
    CPP=arm-linux-androideabi-cpp 
    CXX=arm-linux-androideabi-g++ 
    AR=arm-linux-androideabi-ar 
    RANLIB=arm-linux-androideabi-ranlib 
    LD=arm-linux-androideabi-ld 

    CXXFLAGS += -fPIC -DCRYPTOPP_DISABLE_ASM --sysroot=$(ANDROID_SYSROOT) -I$(ANDROID_STL_INC) 
    LDLIBS += $(ANDROID_STL_LIB) 
endif 

일부 Android 관련 항목을 찾을 수 있도록 한 두 개의 라이너가 있습니다.


마지막 질문은 다음과 같아야합니다 IS_CROSS_COMPILEIS_ANDROID는, ANDROID_SYSROOT 친구가 어디에 설정되어 있습니까? 대답은 setenv-android.sh입니다.

setenv-android.sh에 대한 다운로드는 페이지 하단에도 있습니다.


When I execute command 'make static dynamic cryptest.exe' I get this error:

g++ -DNDEBUG -g -O2 -march=native -DCRYPTOPP_DISABLE_ASM -pipe -c shacal2.cpp 

당신은 setenv-android.sh를 실행하지 않았다. 튜토리얼 상태로, 컴파일러 명령 당신이 볼 것을 :

arm-linux-androideabi-g++ -DNDEBUG -g -O2 -DCRYPTOPP_DISABLE_ASM -pipe -fPIC 
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm -I/opt/android-ndk-r9/sources/ 
cxx-stl/stlport/stlport/ -c 3way.cpp 
... 

I am using cygwin to compile this.

튜토리얼은 안드로이드 NDK에 대해 작성되었습니다. 절차와 스크립트는 Linux 및 Mac OS X에서 테스트되었습니다.

NDK는 Cygwin에서 작동해야합니다. Crypto ++는 Cygwin에서 작동합니다. 그러나 Windows에서 Android와 Cygwin의 조합은 테스트되지 않았으며 Makefile은 더 많은 조정이 필요할 수 있습니다. 나는 그것의 결코 테스트되지 않았기 때문에 나는 단지 모른다.

Windows에서 Linux 가상 컴퓨터를 설정할 수 있습니까? 프로세스를 완료하는 것이 더 쉬울 수도 있습니다. 그 호스트 컴퓨터에서 실행되는 경우 완성도를 들어

When I execute command 'make static dynamic cryptest.exe'...


, cryptest.exe이 실패합니다. adb (테스트 벡터와 함께)을 통해 cryptest.exe을 장치에 푸시 한 다음 장치에서 실행해야합니다. 나는 튜토리얼도 그것을 다루고 있다고 생각한다.

+0

답변 해 주셔서 감사합니다. 예, 환경 변수에 문제가있었습니다 (여전히 있습니다). 나는 setenv-android.sh가 모든 환경 변수를 설정하지 않았다는 것을 언급하지 않았다. 나는 그것을 수동으로했지만 컴파일러는 그가 다른 헤더를 찾을 수 없다는 비명을 지른다. 그래서 지금은 포기했고 헤더와 * .cpp 파일을 JNI 폴더에 복사하고 appriopriate Android.mk를 사용하여 준비했습니다. 어쩌면 내가 언젠가 당신이 말했듯이 나는 리눅스에서 그것을하려고 할 것입니다. – user1683637

+0

"'setenv-android.sh'가 모든 환경 변수를 설정하지 않았다는 것에 주목하지 못했습니다 ..."- 스크립트를 실행하여 현재 변경 사항을 적용 할 때 선행 점 "."을 사용했는지 확인하십시오 껍질. 즉,'. ./setenv-android.sh'. – jww

3

동일한 문제가 발생하여 cygwin에서 성공적으로 컴파일 된 것 같습니다. 이전 답변 (링크 http://www.cryptopp.com/wiki/Android_(Command_Line))에 의해 참조 된 지침을 따라 가다가 헤더를 찾을 수없는 g ++ 문제에 부딪혔다.

g ++의 편리한 -v 옵션에 따라 문제가 발견되었습니다. 문제는 g ++가 cygwin 환경 내에서 "/ opt/android-ndk-r9d/etc/..." 경로를 구문 분석 할 수 없다는 것입니다. CXXFLAGS의 GNUmakefile '은 찾지 패치에 -v 옵션을 추가하면 보여 주었다 모두 $ ANDROID_STL_INC 모두가 에서 떨어졌다 setenv-android.sh 스크립트에 의해 설정된 $ ANDROID_TOOLCHAIN ​​ 변수 "존재하지 않는 디렉토리를 무시 ..."/Cygwin에서/C/옵션/안드로이드 NDK-r9d/등 :

은 내가 WINDOWS 스타일의 경로 (예 : C와 $ (ANDROID_TOOLCHAIN)$ (ANDROID_STL_INC)를 대체하여이 고정/...) 및 라이브러리가 컴파일됩니다. 만세.

그러나 cryptest.exe가 실패한 것으로 보입니다. 내가 더 많이 고칠수록 갱신 될 것이다.

UPDATE

같은 문제도 setenv-android.sh가 설정 한 $ ANDROID_STL_LIB 구문 분석 할 수 없습니다. LBLIBS을 GNUMakeFile에 WINDOWS 스타일 경로 C :/cygwin/c/opt/android-ndk-r9d/etc /.../ libstlport_shared.so 및 전체 컴파일로 바 꾸었습니다.

관련 문제