首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

mingw 调用自己编译的 cryptopp.dll 失败了解决方法

2012-03-11 
mingw 调用自己编译的 cryptopp.dll 失败了那个 dll, 是我自己用 crypto++ 的源代码用 mingw 编译链接出来

mingw 调用自己编译的 cryptopp.dll 失败了
那个 dll, 是我自己用 crypto++ 的源代码用 mingw 编译链接出来的,链接后得到 cryptopp.dll 和 libcrypto.a
主程序是基于 Qt 的,也是用 mingw 编译。链接时的命令是

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\App.exe debug/main.o debug/mainwindow.o debug/Crypto.o debug/asaplaintextedit.o debug/moc_mainwindow.o debug/qrc_App.o -L"c:\Qt\2010.01\qt\lib" -lmingw32 -lqtmaind -L. -lcryptopp -lQtGuid4 -lQtCored4

结果冒出了一百多个 undefined reference to
首先说明以下,我链接的 dll 应该没问题。我用 w32dsm 反汇编看了,该有的函数都有。(也就是那里提示缺的函数 dll 里都有)
换一个命令链接也不行

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\App.exe debug/main.o debug/mainwindow.o debug/Crypto.o debug/asaplaintextedit.o debug/moc_mainwindow.o debug/qrc_App.o -L"c:\Qt\2010.01\qt\lib" -lmingw32 -lqtmaind cryptopp.dll -lQtGuid4 -lQtCored4

再说明一下,我的程序也没问题,在 linux 可以编译链接通过,可以运行。
再附上编译 cryptopp.dll 时的命令

g++ -c *.cpp

g++ -shared -o cryptopp.dll 3way.o adler32.o algebra.o algparam.o arc4.o asn.o authenc.o base32.o base64.o basecode.o bench.o bench2.o bfinit.o blowfish.o blumshub.o camellia.o cast.o casts.o cbcmac.o ccm.o channels.o cmac.o cpu.o crc.o cryptlib.o cryptlib_bds.o default.o des.o dessp.o dh.o dh2.o dll.o dsa.o eax.o ec2n.o eccrypto.o ecp.o elgamal.o emsa2.o eprecomp.o esign.o files.o filters.o fips140.o fipsalgt.o gcm.o gf256.o gf2n.o gf2_32.o gfpcrypt.o gost.o gzip.o hex.o hmac.o hrtimer.o ida.o idea.o integer.o iterhash.o luc.o mars.o marss.o md2.o md4.o md5.o misc.o modes.o mqueue.o mqv.o nbtheory.o network.o oaep.o osrng.o panama.o pch.o pkcspad.o polynomi.o pssr.o pubkey.o queue.o rabin.o randpool.o rc2.o rc5.o rc6.o rdtables.o rijndael.o ripemd.o rng.o rsa.o rw.o safer.o salsa.o seal.o seed.o sha.o shacal2.o shark.o sharkbox.o simple.o skipjack.o square.o squaretb.o strciphr.o tea.o tftables.o tiger.o tigertab.o trdlocal.o ttmac.o twofish.o vmac.o wait.o wake.o whrlpool.o winpipes.o xtr.o xtrcrypt.o zdeflate.o zinflate.o zlib.o -Wl,--out-implib,libcryptopp.a

(链接时没有链接 validat1.o, validat2.o, validat3.o, socketft.o, 因为链接不上,好像缺了 MFC 的库。另外一些文件名带有 test 是测试程序代码,也没有链接。)

我该怎么办?

[解决办法]
跨平台其实就是个妥协过程,但这个过程中有偏向,pthread跨平台,但是Windows only开发者没人用它,因为Windows的线程远比posix线程更纯粹。

MFC虽然不跨平台但是跨编译器,但你也没见过人家在gcc上搞mfc吧。


[解决办法]
如果是libcrypto.a的话,试试看用-lcrypto
[解决办法]

探讨
我不用 VS 编译是因为它没事就把 .Net Framework 给链接上,一个 cryptopp 已经够大了,我可不想再带上一个 300MB 的 .Net Framework

[解决办法]
Please Link cryptopp with ws2_32
What's more, you should know that the dll compiled by mingw should be used like Linux's .so. It means you should not include "dll.h" or define CRYPTOPP_IMPORTS, etc.

热点排行