前言
安装 MSYS2
MSYS2 是一种在 Windows 上获取 GCC 的方法。除了编译器之外,它在其包管理器中还提供了一些预构建的库,以及命令行实用程序的端口,例如 bash 或 make(在 Linux 上开箱即用,但通常不适用于窗户)。
首先,卸载您当前可能拥有的 MinGW/GCC 上的任何版本。从 MSYS2 安装 GCC 后,您可以告诉 CodeBlocks 使用它而不是现在使用的任何东西。
从here 下载并安装 MSYS2。您不希望安装路径包含空格或任何奇怪的符号。
启动它,你应该会看到一个终端。
-- 更新 MSYS2 --
MSYS2 应在安装后更新。要更新,请运行 pacman -Syuu。
它可能会警告您它将自行关闭以完成更新。 如果发生这种情况,请重新启动它并再次运行相同的命令以完成更新。
您可能希望不时运行此命令以使您的安装保持最新。
现在您可以运行pacman -Ss SomeText 来搜索包,运行pacman -S PackageNames 来安装包。
-- MSYS2的三个方面--
MSYS2 可以在三种不同的模式下启动,当前模式以洋红色字母显示在终端中。
选择模式的一种方法是使用安装目录中的不同 exe 文件(mingw64.exe 等)。
在包管理器中,有三组对应于这些模式的包。安装包时激活哪种模式无关紧要,但对于实际编译很重要。
-
MINGW32 - 用于编译 32 位应用程序。包名以mingw-w64-i686-为前缀。
-
MINGW64 - 用于编译 64 位应用程序。包名以mingw-w64-x86_64-为前缀
-
MSYS - 用于使用 POSIX 仿真编译应用程序。包没有前缀。
通常您不想使用最后一个。它用于编译最初为类 Linux 系统编写的非便携式应用程序,否则这些应用程序在 Windows 上不起作用。 MSYS2自带的bash、make等程序都是用它编译的。
您通常会看到一个包的三种变体,每种模式一个。例如,如果您执行pacmake -Ss gcc(搜索“gcc”包),您将看到mingw-w64-i686-gcc、mingw-w64-x86_64-gcc 和gcc。
你如何从三个包中选择一个包?这是经验法则:
-
首先,寻找一个带前缀的包。 (mingw-w64-x86_64-... 编译 64 位,mingw-w64-i686-... 编译 32 位)。
-
如果没有前缀包,而您正在寻找编译器或库,那么您很不走运,没有这样的包。
-
如果您不是在寻找编译器或库,您可以选择不带前缀的包。
-- 安装工具--
有了这些知识,您就可以从 MSYS2 包管理器安装工具了。
-
pacman -S mingw-w64-x86_64-gcc 代表 GCC。
-
pacman -S mingw-w64-x86_64-gdb 用于 GDB,调试器。可能有用。
-
pacman -S mingw-w64-x86_64-cmake make patch 用于其他一些工具。希望我没有忘记任何事情。
请注意,make 是经验法则的例外。还有另一个包名为 mingw-w64-x86_64-make,但长话短说它是 jank,你想改用不带前缀的 make。
我曾经在使用 CMake 包时遇到过一些问题。如果它开始起作用,请将其卸载并下载官方 CMake 安装程序。如果你使用它,别忘了将它添加到PATH。
编译库
我要编译APR,其他的库应该差不多。
首先,我在包中搜索它:pacman -Ss apr - 包在那里。我尝试安装它并编译了一个测试程序(它工作),所以我们确定它可以在 Windows 上使用。
但既然你想自己编译它,我们会继续。如果您决定安装 APR 包进行试用,现在是卸载它的好时机,以避免任何干扰。
确保 MSYS2 在MINGW64 模式下运行(查看终端中的洋红色文本)。如果不是,请使用mingw64.exe 重新启动它。当您安装软件包时,处于活动状态的模式并不重要,但现在当您编译时,它变得很重要。
我将首先展示我失败的尝试,以解释思考过程。
-- 尝试 1 失败--
我从here 下载了 APR 源。 Windows 和 Linux 有单独的下载,我决定去apr-1.7.0-win32-src.zip。
提取档案。在终端中打开生成的目录(使用cd,希望你知道这是什么)。
你接下来要做什么取决于你看到的文件。
由于有CMakeLists.txt,我尝试使用 CMake 构建:
# Create an arbitrary directory
mkdir _build
cd _build
# Configure
cmake .. -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -G "MSYS Makefiles"
# Build (-j12 is optional, 12 is the number of CPU cores you want to use)
make -j12
在最后一个命令中,我得到了一些神秘的错误。让我们试试别的。我删除了_build 并开始寻找不同的方法。
-- 尝试 2 失败--
我下载了apr-1.7.0.tar.gz(源代码的非 Windows 变体)。有CMakeLists.txt,所以我再次尝试了 CMake - 不,没有运气。
我还看到了一个configure 文件,因此也可以使用 Autotools 进行构建。 (通常是CMakeLists.txt 或configure。如果你都没有看到,那么构建过程就更奇特了,应该在自述文件中解释。)
让我们试试 Autotools:
# Configure
./configure
# Build
make -j12
第一步出现错误,所以我们需要一种不同的方法。
-- 成功尝试--
通常此时您已经成功,但 APR 拒绝开箱即用。然而 MSYS2 的人设法构建了它,如何?
让我们弄清楚。转到MSYS2 package sources 和look for APR。
这里我们看到了几个.patch 文件。他们解释了 MSYS2 开发人员对 APR 源代码进行了哪些修改才能构建它。它们采用计算机可读格式,并且有一个程序可以自动将它们应用于代码。
下载.patch文件,以后会有用。
现在查看PKGBUILD 文件。它包含有关构建 APR 的计算机可读说明。有一种方法可以自动执行它们,但出于教育目的,我宁愿手动执行。
我不了解PKGBUILD 的所有内容,但这不是必需的。您会在其中看到以下内容:
-
prepare() {
cd "${srcdir}/${_realname}-${pkgver}"
patch -p0 -i ${srcdir}/apr_ssize_t.patch
patch -p0 -i ${srcdir}/apr_wtypes.patch
./buildconf
# autoreconf -fi
}
这就是他们为构建“准备”的方式。让我们做一些类似的事情。将补丁文件复制到apr-1.6.5目录并运行:
patch -p0 -i apr_wtypes.patch
patch -p0 -i apr_ssize_t.patch
./buildconf
而且...它构建成功!
使用编译库
您编译了库,它创建了一些文件供您使用。它们是什么?
您需要.a(静态库)和.dll(动态库)。快速搜索显示它们位于.libs 目录中。
您还需要标题,它们似乎位于include 目录中。其他一切都不再需要了。
现在您需要知道要使用哪些编译器和链接器标志。这些可以在.pc 文件(在这种情况下为apr.pc)中找到,对我来说看起来像这样:
prefix=/usr/local/apr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
APR_MAJOR_VERSION=1
includedir=${prefix}/include/apr-${APR_MAJOR_VERSION}
Name: APR
Description: The Apache Portable Runtime library
Version: 1.6.5
Libs: -L${libdir} -lapr-${APR_MAJOR_VERSION} -lshell32 -ladvapi32 -lws2_32 -lrpcrt4 -lmswsock
Cflags: -DWIN32 -D__MSVCRT__ -D_LARGEFILE64_SOURCE -g -O2 -I${includedir}
查看最后两行并忽略一些可选标志,我们得到:
- 编译器标志:
-DWIN32 -D__MSVCRT__ -D_LARGEFILE64_SOURCE -Ipath/to/apr-1.6.5/include
- 链接器标志:
-lapr-1 -lshell32 -ladvapi32 -lws2_32 -lrpcrt4 -lmswsock -Lpath/to-apr-1.6.5/.libs
现在我们可以尝试从终端编译一个简单的程序。创建一个名为1.cpp 的文件,其内容如下:
#include <iostream>
#include <apr_strings.h>
int main()
{
char a[] = " Hello , world ! ";
char b[sizeof a];
apr_collapse_spaces(b, a);
std::cout << b << '\n';
}
使用以下方法构建它:
g++ 1.cpp -DWIN32 -D__MSVCRT__ -D_LARGEFILE64_SOURCE -Iapr-1.6.5/include -lapr-1 -lshell32 -ladvapi32 -lws2_32 -lrpcrt4 -lmswsock -Lapr-1.6.5/.libs
由于我们是从终端构建的,所以我们的编译器和链接器标志在同一个地方。但是当您使用 CodeBlocks 时,您必须将它们放在项目设置中的两个不同位置。
在此命令中,您必须将 -I 和 -L 之后的路径替换为 APR 源的实际路径。
如果命令运行成功,您将获得a.exe。
要运行它,首先需要将apr-1.6.5/.libs中的所有.dlls复制到.exe所在的目录下。现在您应该可以输入./a.exe 并看到它打印Hello,world!。
代码块
如果你想从 CodeBlocks 做同样的事情,你需要创建一个项目,并在项目设置中指定你在此处使用的相同编译器和链接器标志。
此外,在 CodeBlocks 设置中,您必须指定从 MSYS2 安装的 GCC 编译器的路径(它应该在 C:/msys64/mingw64/bin/ 中)。