如何使用 mingw 编译 cryptopp 5.6.2

Posted

技术标签:

【中文标题】如何使用 mingw 编译 cryptopp 5.6.2【英文标题】:howto compile cryptopp 5.6.2 with mingw 【发布时间】:2013-08-06 16:22:14 【问题描述】:

我正在尝试使用 mingw 4.8.1 (sjlj) 构建 cryptopp 5.6.1。我已将 GNUMakefile 从 Crypto++ & MinGW 更改为

但是有几个问题:

如果我尝试将其构建为共享库,则会出现编译错误; 在我的机器上它可以工作(intel i5(第 2 代)和 Windows 7),但在 Intel atom 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 编译成功 crypto++ 吗?这是我的 makefile 的 sn-p:

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 xp 的 mscvrt.dll 更改为在 Windows 7 上定义的吗?

【问题讨论】:

【参考方案1】:

构建它的一种方法是使用 qmake:

我删除了 GNUMakefile, qmake -项目 我在 QtCreator 中打开 pro 文件,将 TEMPLATE 更改为 lib 并将 ws2_32 添加到 lib

pro 文件现在看起来像这样

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

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

看来可以了。

【讨论】:

这是 64bit 还是 32bit cygwin?【参考方案2】:

试一试

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

【讨论】:

我已经从构建中删除了 modexppc.cpp (changein makefile)。 以及为什么您(在您的问题中)给我们一个错误:make: *** No rule to make target 'modexppc.export.o', needed by 'libcryptopp.dll'. Stop.。如果您从 makefile 中删除了modexppc.cpp,您将不会收到此错误。 我稍后尝试删除。我做了几次尝试 你在每次尝试之前都会进行清理吗?我的解决方案会带来什么结果?? 您对我的解决方案有什么好处?【参考方案3】:

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

Crypto++ 5.6.2 现在无需在 MinGW 上进行修改即可正常构建,使用 make(并正确设置 CC、CXX 和 PATH 环境变量)。在使用 MinGW 4.9 IIRC 的 CentOS 7 上测试。

【讨论】:

以上是关于如何使用 mingw 编译 cryptopp 5.6.2的主要内容,如果未能解决你的问题,请参考以下文章

编译时错误:未定义对 CryptoPP::StringStore::TransferTo2 的引用

Linux aarch64交叉编译之 cryptopp加密库

CryptoPP:如何使用 SocketSource 和 SocketSink

我需要在 Qt 中使用 CryptoPP DLL 吗?

使用 MinGW 静态构建 Qt 5.7 时,如何解决此构建错误?

在 windows7 上使用 mingw32 编译 Qt 4.8.5:“没有这样的文件或目录”