如何在Linux上使用MinGW构建Crypto++库?

3

我正在尝试将一个C++项目从Visual Studio 2013移植到Ubuntu上的NetBeans。目标是Windows可执行文件,目前我能够使用mingw作为编译器从NetBeans编译Windows可执行文件。

该项目需要使用Crypto++库,我只有Visual Studio的.lib版本。要在NetBeans中包含库,我首先需要将Crypto++库构建为.a格式。

我不清楚应该如何做到这一点。我找到了关于使用mingw在Linux上构建库的信息,但没有关于使用mingw进行交叉编译的信息。提供的GNUmakefile不起作用。我应该设置一个带有Windows和mingw的虚拟机来编译库吗?或者像这里http://www.qtcentre.org/threads/28809-Compiling-amp-using-Crypto-with-mingw-version-of-Qt所建议的那样使用qmake“hack”?那里推荐的最新的好的Crypto++版本非常旧。这很令人困惑,整个项目的移植比需要的库更容易。我接受任何建议。

tldr:如何在Linux上构建libcryptopp.a以便交叉编译Windows可执行文件项目

编辑: 例如,如果我交叉编译某些内容,/usr/i686-w64-mingw32/lib/文件夹中会有Windows库,例如libuser32.a。我需要制作相等的libcryptopp.a.. 抱歉如果不太清楚。如果我只是按照答案(和维基)中的步骤构建,我最终会得到一个libcryptopp.a文件,但我怀疑它仅限于Linux,因为如果我在NetBeans中连接该库到正在交叉编译的.exe文件中,我会发现到处都是未定义的对cryptopp相关内容的引用。路径是正确的,我怀疑该库需要用与交叉编译兼容的等效libcryptopp.a替换。

编辑2:我试图按照下面的答案进行操作,现在卡在这里了。执行此命令以构建cryptopp之后。

    make CXX=/usr/bin/i686-w64-mingw32-gcc INCLUDES="-I /usr/i686-w64-mingw32/include" LIBS="-L /usr/i686-w64-mingw32/lib" CXXFLAGS="-std=c++0x"

每当我尝试它的许多变体时,最终都会出现这个错误:

trap.h:26:25: 致命错误:Windows.h:没有那个文件或目录 # include

这使我认为它正在使用正确的编译器制作用于交叉编译Windows .exe的库的.a文件。 但是我不明白现在发生了什么,缺少头文件..:(

此外,如果我尝试链接库文件(与Visual Studio一起使用),我会得到很多链接错误,未定义对cryptopp的引用。

如果有人知道如何解决问题,我将提供象征性啤酒(几美元的比特币)。


“提供的GNUmakefile无法工作…” - 如果您有具体的问题,那么您应该说明是什么问题。这并没有告诉我们任何有用的信息。您是否在unzip命令中使用了-a选项? - jww
是的,我用了 unzip 命令并加上了 -a 参数。 - 3codyz0
前往Crypto++用户列表并提出问题。我们会在那里解决这个问题。Stack Overflow不适合我们需要的沟通方式。据我所知,这种情况从未被讨论过。说明您正在尝试交叉编译。告诉我们您如何进入配置(例如安装了哪些软件包)。告诉我们您的确切构建方式。提供编译器的示例调用(一个源文件,如cryptlib.cpp)。 - jww
我设法解决了问题,在编辑2中我用g++替换了make字符串中的gcc。它会抛出一些有关winsock2的链接错误,但是库实际上已经构建并且似乎可以工作。太糟糕了,我发现我要将项目移植到Netbeans的许多东西在编译器之间不兼容,修复起来可能会很麻烦。感谢jww的帮助 :) - 3codyz0
2个回答

2

0
我已经找到了有关如何使用mingw在linux上构建库的信息,但没有关于使用mingw进行交叉编译的信息。
这相对容易...
1. 将Crypto++ ZIP文件下载到MinGW中。 2. 解压缩Crypto++ ZIP文件。 3. 更改目录。 4. 构建库。 5. 验证所有测试都通过。
(1)和(2)可能会有些棘手,因为Cygwin和MinGW缺少很多工具。所以curl https://www.cryptopp.com/cryptopp563.zip -o cryptopp563.zip可能无法正常工作。
对于(2),我记得ZIP文件可能会丢失,所以unzip -aoq cryptopp563.zip -d cryptopp-5.6.3可能无法正常工作。
在第四步中,只需执行make static dynamic test并确保它完成并通过了所有测试。

我经常使用Cygwin和MinGW进行测试。我有一个脚本,可以将Crypto++从我的桌面复制到这些环境中。但我一直没有找到自动化的方法。最近有人提出了一个关于自动化的问题,但是该问题已被关闭,因此没有人能够提供答案(请参见如何自动化Cygwin和MinGW的软件测试)。


我正在尝试在最新的Ubuntu上进行此操作,已安装mingw32和64,当然curl和unzip也可以正常工作,并且make static dynamic test测试以全部测试通过结束。但是我怀疑这样做会为Linux构建.a库,如果将该库链接到Windows的.exe文件中,则无法正常工作。如果我将库添加到NetBeans中的我的.exe Windows项目中,则无法正常工作。运行“i686-w64-mingw32-g++ make static dynamic test”或i686-w64-mingw32-gcc会出现错误,如make: no such file static:no such file dynamic: no such file..我该如何构建.a cryptopp库以链接到.exe文件? - 3codyz0
简而言之:您的步骤是正确的,但在Ubuntu上使用Mingw执行这些步骤只会生成适用于Linux的.a库文件(如果我错了,请纠正我)。如何生成一个能够与我要交叉编译的.exe文件一起工作的.a库?我需要设置一个带有Windows、Cygwin/Mingw的虚拟机,并在那里构建库吗?谢谢。JWW - 3codyz0
我正尝试使用gcc/g++/mingw及其工具链在Ubuntu上交叉编译一个.exe Windows文件。 - 3codyz0
我有点困惑(但这是由于我的无知)...我在Ubuntu上不使用MinGW,所以我不确定问题是什么。我得走一下了。 - jww
我也很困惑 :) 如果其他方法都失败了,我可以尝试在Windows机器上使用Mingw来做。谢谢。 - 3codyz0
如何自动化软件测试 链接404。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接