如何使用mingw编译cryptopp 5.6.2

时间:2013-08-06 16:22:14

标签: c++ windows-xp mingw shared-libraries crypto++

我正在尝试使用mingw 4.8.1(sjlj)构建cryptopp 5.6.1。我已经从Crypto++ & MinGW

更改了GNUMakefile

但有几个问题:

  • 如果我尝试将其构建为共享库,我会编译错误;
  • 在我的机器上它可以运行(英特尔i5(第2代)和Windows 7)但是在英特尔原子D2500上的Windows Xp上发生错误(msvcrt.dll中没有memmove_s的入口点)

当我尝试构建共享库时,我遇到以下错误:

make dll
make: *** No rule to make target 'cryptopp.dll', needed by 'cryptest.import.exe'. Stop.
make libcryptopp.dll
// ...
g++ -std=c++11 -DNDEBUG -O3 -m32 -msse2 -msse3 -mssse3 -DCRYPTOPP_EXPORTS -c hex.cpp -o hex.export.o
g++ -std=c++11 -DNDEBUG -O3 -m32 -msse2 -msse3 -mssse3 -DCRYPTOPP_EXPORTS -c hmac.cpp -o hmac.export.o
g++ -std=c++11 -DNDEBUG -O3 -m32 -msse2 -msse3 -mssse3 -DCRYPTOPP_EXPORTS -c integer.cpp -o integer.export.o
g++ -std=c++11 -DNDEBUG -O3 -m32 -msse2 -msse3 -mssse3 -DCRYPTOPP_EXPORTS -c iterhash.cpp -o iterhash.export.o
g++ -std=c++11 -DNDEBUG -O3 -m32 -msse2 -msse3 -mssse3 -DCRYPTOPP_EXPORTS -c misc.cpp -o misc.export.o
g++ -std=c++11 -DNDEBUG -O3 -m32 -msse2 -msse3 -mssse3 -DCRYPTOPP_EXPORTS -c modes.cpp -o modes.export.o
make: *** No rule to make target 'modexppc.export.o', needed by 'libcryptopp.dll'.  Stop.

有人用mingw 4.8.1编译成功的加密++吗?这是我的makefile的片段:

CXXFLAGS = -std=c++11 -DNDEBUG -O3 -m32 -msse2 -msse3 -mssse3
ARFLAGS = rc
LDLIBS += -lws2_32
LDFLAGS =
MKDIR = mkdir
CP = copy

SRCS = $(wildcard *.cpp)

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

lib: libcryptopp.a

all: cryptest.exe

test: cryptest.exe
    cryptest.exe v

install: lib
    $(CP) *.h include\cryptopp
    $(CP) *.a lib

clean:
    del cryptest.exe libcryptopp.a $(LIBOBJS) $(TESTOBJS) cryptopp.dll libcryptopp.dll.a libcryptopp.import.a cryptest.import.exe dlltest.exe $(DLLOBJS) $(LIBIMPORTOBJS) $(TESTIMPORTOBJS) $(DLLTESTOBJS)

libcryptopp.a: $(LIBOBJS)
    $(AR) $(ARFLAGS) $@ $(LIBOBJS)

libcryptopp.so: $(LIBOBJS)
    $(CXX) -shared -o $@ $(LIBOBJS)

cryptest.exe: libcryptopp.a $(TESTOBJS)
    $(CXX) -o $@ $(CXXFLAGS) $(TESTOBJS) -L. -lcryptopp $(LDFLAGS) $(LDLIBS)

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

dll: cryptest.import.exe dlltest.exe

libcryptopp.dll: $(DLLOBJS)
    $(CXX) -shared -o $@ $(CXXFLAGS) $(DLLOBJS) $(LDFLAGS) $(LDLIBS) -Wl,--out-implib=libcryptopp.dll.a

libcryptopp.import.a: $(LIBIMPORTOBJS)
    $(AR) $(ARFLAGS) $@ $(LIBIMPORTOBJS)
    $(RANLIB) $@

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

dlltest.exe: cryptopp.dll $(DLLTESTOBJS)
    $(CXX) -o $@ $(CXXFLAGS) $(DLLTESTOBJS) -L. -lcryptopp.dll $(LDFLAGS) $(LDLIBS)

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

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

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

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

修改

为了让它工作,我强制在misc.h(cryptopp)中定义的函数memmove_s被内联定义,现在也适用于windows xp(其中memmove_s未在msvcrt.dll中定义)。

问题:我可以使用在Windows 7上定义的内容更改windows xp的mscvrt.dll吗?

3 个答案:

答案 0 :(得分:4)

构建它的方法是使用qmake:

  • 我删除了GNUMakefile,
  • qmake -project
  • 我将专业文件打开到QtCreator,将TEMPLATE更改为lib并将ws2_32添加到lib

专业版文件现在看起来像这个

TEMPLATE = lib
INCLUDEPATH += .
CONFIG -= qt
HEADERS += ...
SOURCES += ...

win32-g++ {
    QMAKE_CXXFLAGS += -msse -msse2 -msse3 -mssse3
    LIBS += -lws2_32
}

看起来很有效。

答案 1 :(得分:1)

这是一次尝试

modexppc.cpp放入CRYPTOPP文件夹。

modexppc.cpp

// modexppc.cpp - written and placed in the public domain by Wei Dai

#include "pch.h"

#ifndef CRYPTOPP_IMPORTS

#include "modexppc.h"
#include "asn.h"
NAMESPACE_BEGIN(CryptoPP)


NAMESPACE_END

#endif

答案 2 :(得分:1)

我在Windows XP中向MinGW开发团队发送了patch修复memmove_s。它已被接受,很快就会出现在较新的MinGW版本中。到目前为止,它应该可以在CentOS 7 MinGW发行版和Fedora 21 MinGW上使用。

Crypto ++ 5.6.2现在可以在不修改MinGW的情况下构建,使用make(并正确设置CC,CXX和PATH环境变量)。在CentOS 7上测试,使用MinGW 4.9 IIRC。