如何使用 MinGW 在 Linux 上构建 Crypto++ 库?
Posted
技术标签:
【中文标题】如何使用 MinGW 在 Linux 上构建 Crypto++ 库?【英文标题】:How to build Crypto++ library on Linux with MinGW? 【发布时间】:2015-10-12 18:34:52 【问题描述】:我正在尝试将 c++ 项目从 Visual Studio 2013 移植到 ubuntu 上的 netbeans。目标是一个windows可执行文件,到目前为止我能够使用mingw作为编译器从netbeans编译windows exe文件。
该项目需要 Crypto++ 库,而我只有 Visual Studio 的 .lib 版本。要将库包含在 netbeans 中,我首先需要以 .a 格式构建 Crypto++ 库。
我不清楚我该怎么做。 我找到了有关如何使用 mingw 为 linux 构建库而不是使用 mingw 进行交叉编译的信息。提供的 GNUmakefile 不起作用。 我应该用 windows 和 mingw 设置一个 vm 并以这种方式编译库吗?或者也许使用这里建议的 qmake “hack” http://www.qtcentre.org/threads/28809-Compiling-amp-using-Crypto-with-mingw-version-of-Qt ?建议的最后一个好的 Crypto++ 版本已经很老了。这很令人困惑,移植整个项目比拥有所需的库更容易。 我愿意接受任何建议。
tldr:如何在 linux 上构建 libcryptopp.a 用于交叉编译 windows exe 项目
编辑: 例如,如果我交叉编译某些东西,那么 /usr/i686-w64-mingw32/lib/ 文件夹中有 Windows 库,例如 libuser32.a。我需要制作等效的 libcryptopp.a .. 抱歉,如果有点不清楚。 如果我只是使用答案中的步骤(以及在 wiki 中)进行构建,我最终会得到一个 libcryptopp.a 文件,但我怀疑它仅限于 linux,因为如果我在 .exe 文件中的 netbeans 中链接该库,我会交叉编译我结束到处都有对cryptopp东西的未定义引用。路径正确,我怀疑该库需要替换为与交叉编译兼容的等效 libcryptopp.a。
edit2:我试图在这里遵循答案,现在我被困在这里。在此命令之后构建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:没有这样的文件或目录 # 包含
这让我觉得它使用正确的编译器来制作一个 .a lib 文件,以便将 windows .exe 与 lib 交叉编译。 但是我不明白缺少标题现在发生了什么..:(
另外,如果我尝试链接 lib 文件(与 Visual Studio 一起使用),我会收到很多链接错误,未定义对 cryptopp 内容的引用。
如果有人知道怎么做,我会提供象征性的啤酒(几美元的比特币)。
【问题讨论】:
"提供的 GNUmakefile 不起作用..." - 如果您有特定的问题,那么您应该说明它是什么。这并没有告诉我们任何有用的信息。您是否将-a
与unzip
一起使用?
是的,我确实使用 -a 解压缩。
转到Crypto++ User List 并提出问题。我们将把这个问题带到那里。 Stack Overflow 不适合我们需要的通信。据我所知,这种事情从来没有被讨论过。说明您正在尝试交叉编译。告诉我们您是如何进入配置的(例如您安装了哪些软件包)。告诉我们你是如何建造的。在编译器上提供一个示例调用(一个源文件,如cryptlib.cpp
)。
我以某种方式做到了,我用 g++ 替换了我在 op 的编辑 2 中发布的 make 字符串中的 gcc。它引发了一些有关 winsock2 的链接错误,但该库实际上已构建并且似乎可以正常工作。太糟糕了,我发现我要移植到 netbeans 的项目的很多东西在编译器之间是不兼容的,这可能是一个很大的问题。感谢您的帮助 jww :)
【参考方案1】:
灵感来自http://wiki.amule.org/wiki/Cross-compilation_for_windows_with_mingw:
sudo apt-get install mingw-w64
git clone https://github.com/weidai11/cryptopp
cd cryptopp
export TARGET=i686-w64-mingw32
CXX=$TARGET-g++ RANLIB=$TARGET-ranlib AR=$TARGET-ar LDLIBS=-lws2_32 make -f GNUmakefile
【讨论】:
【参考方案2】:我找到了有关如何使用 mingw 为 linux 构建库但不使用 mingw 进行交叉编译的信息。
相对容易...
-
将 Crypto++ ZIP 下载到 MinGW。
解压 Crypto++ ZIP。
更改目录。
构建库。
验证
All tests passed
。
(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
可能不起作用。
在第 (4) 步,只需执行 make static dynamic test
并确保它以 All tests passed
结束。
我用 Cygwin 和 MinGW 做了很多测试。我有一个脚本,可以将 Crypto++ 从我的桌面复制到环境中。我还没有找到一种自动化的方法。最近关于自动化的问题已关闭,因此没有人可以提供答案(请参阅How to automate software testing for Cygwin and MinGW)。
【讨论】:
我试图在最新的 ubuntu 上执行此操作,安装了 mingw32 和 64,当然 curl 和解压缩工作,并使静态动态测试以所有测试通过结束。但是我怀疑这样做我会为 linux 构建 .a 库,如果我将该库链接到 windows 的 .exe 文件,它将无法工作。如果我在 netbeans 中将库添加到我的 .exe windows 项目中,它就不起作用。运行“i686-w64-mingw32-g++ 进行静态动态测试”或 i686-w64-mingw32-gcc 会出现错误,如 make: no such file static:no such file dynamic: no such file..我如何构建 .a cryptopp链接到 .exe 文件的库? tldr:您的步骤是正确的,但是在带有 mingw 的 ubuntu 机器上执行这些操作会生成一个仅适用于 linux 的 .a 库文件(如果我错了,请纠正我)。如何生成与要交叉编译的 .exe 文件一起使用的 .a 库?我是否需要设置一个带有 windows、cygwin/mingw 的 VM 并在那里只构建库?谢谢jww 我正在尝试使用 gcc/g++/mingw 和该工具链从 ubuntu 交叉编译 .exe windows 文件。 我有点困惑(但这是由于我的无知)...我不在 Ubuntu 上使用 MinGW,所以我不确定问题是什么。我将不得不走出去。 我也很困惑 :) 如果其他一切都失败了,我可以尝试从带有 mingw 的 Windows 框中执行此操作。谢谢。以上是关于如何使用 MinGW 在 Linux 上构建 Crypto++ 库?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mingw64 上使用 boost.test 构建测试?
使用 MinGW 在 Windows 上构建 GLEW 1.7.0