2014-03-29 44 views
2

我有一個問題,使appriopriate GNUmakefile,應創建加密+ Android的庫。我正在使用這個tutorial,並且我一直在修補makefile。我在哪裏可以找到提到的GNUmakefile-android.patch文件?我試圖手動添加文件到行,但我不知道我做的是正確的。現在我的GNUmakefile看起來是這樣的:的Android加密+通過命令行編譯,GNUmakefile

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」我得到這個錯誤:

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 

我使用Cygwin來編譯此。我會很感激的幫助。

+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 

這會取消在Makefile中的 「主機」 的標誌。否則,Crypto ++將爲主機(即您的臺式計算機)設置CXXFLAGS,而不是目標(即您的Android設備)。

接下來您需要的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_ANDROIDANDROID_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.

本教程寫對了Android NDK。程序和腳本在Linux和Mac OS X進行了測試

NDK的應與Cygwin的工作; Crypto ++應該和Cygwin一起工作。然而,Android和Cygwin在Windows上的組合從未經過測試,並且Makefile可能需要更多的調整。我只是不知道,因爲它從未經過測試。

你能建立一個Linux虛擬機在Windows?完成該過程可能更容易。如果在主機上執行


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

爲了完整起見,cryptest.exe將失敗。您應該通過adb(連同測試向量)將cryptest.exe推送到設備,然後在設備上執行它。我認爲教程也涵蓋了這一點。

+0

感謝您的回答。是的,這是環境變量的問題(仍然是)。我沒有注意到setenv-android.sh沒有設置所有應該是的環境變量。我手動做了,但然後編譯器尖叫,他無法找到另一個標題。所以現在我放棄了,我只是將頭文件和* .cpp文件複製到JNI文件夾,並準備appriopriate Android.mk來使用它。也許當我有一段時間的時候,我會嘗試在Linux上做你所說的。 – 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/...」。添加-v選項。CXXFLAGS的GNUMakeFile補丁表明,無論是$ ANDROID_STL_INC$ ANDROID_TOOLCHAIN變量由setenv-android.sh腳本 下雙雙回落將「忽略不存在的目錄。」/cygwin的/ C /選擇/機器人-NDK-r9d /等:

餘通過與WINDOWS風格的路徑(例如ç更換$(ANDROID_TOOLCHAIN)$(ANDROID_STL_INC)固定此/ ...)並編譯這些庫。歡呼。

但是,cryptest.exe似乎失敗了。將更新,因爲我修復更多。

UPDATE

同一問題上,$ ANDROID_STL_LIB通過setenv-android.sh設置也不能被解析。將GNOME文件中的LBLIBS替換爲WINDOWS樣式路徑C:/ cygwin/c/opt/android-ndk-r9d/etc /.../ libstlport_shared.so和完整編譯。