【问题标题】:How to add 3rd party libraries to MinGW?如何将 3rd 方库添加到 MinGW?
【发布时间】:2010-12-31 10:36:44
【问题描述】:

我刚刚在this post之后设置了MinGW环境

但是如何添加第三方库呢?

【问题讨论】:

标签: mingw


【解决方案1】:

与使用gcc的任何其他系统没有区别

  • 获取来源
  • 解压
  • 运行配置 -- 这可能需要一两次调整
  • 制作
  • 进行安装

现在使用带有适当-Lfoo/bar -lfoobar 开关的新库。

我推荐MinGW 周围的MSys 系统来完成这一切。

【讨论】:

  • 哦,我忘了说我用的是windows XP,你能不能说的详细点?
  • 您需要一本关于使用 Unix 工具进行代码开发的书(或网络教程)。这里没有任何特定于 Windows XP 的内容 --- 除了您正在尝试学习 Windows 上不常见的工作流程这一事实。您在这里做的是正确的事情,但是您或多或少需要知道它在 Linux/Unix 上是如何工作的,以推断它在 XP 上是如何完成的。只要在某个地方找到一个像样的教程......
【解决方案2】:

库由两个主要组件组成 - C 头文件和编译的目标代码存档。 GCC 有一系列令人眼花缭乱的方式来指定这些东西,但是假设您使用的是位于相对目录路径 foo/lib 中的库 foo.a 和位于 foo/inc 中的标头 foo.h。您自己的 C 代码位于 main.c 中,如下所示:

#include "foo.h"
int main() {
  return FooFunc();    // call function in foo.a
}

要编译它,你可以使用命令行:

gcc main.c -Ifoo/inc foo/lib/foo.a -o main.exe

-I 标志添加到搜索标题的路径。您也可以添加到 lib 路径,但事情开始变得复杂 :-)

【讨论】:

  • +1,很有帮助!但是你能把它更通用吗?假设我想包含来自两个不同目录的 2 个库。顺便说一句,似乎不是每个库都包含 .h 和 * .a,至少我在MinGW/lib下只看到了.a和*.o?
  • 要指定更多包含路径,请使用更多 -I 标志,要指定更多库,请在命令行中指定它们。归根结底,SO 不是一个教程网站 - 阅读 GCC 手册和一本书,例如 network-theory.co.uk/gcc/intro
【解决方案3】:

我只是自己解决了这个问题。我强烈建议阅读 MinGW 网页上的 linking howtos。仔细阅读它们,因为其中包含很多内容。它们非常透彻,因此非常值得您花时间。

基本上有两种做事方式。首先,您可以将 MinGW 视为编译器,因为它就是这样,并从 cmd.exe(命令提示符)或 IDE 调用它。另一种方法是使用 MSYS,它基本上是一个 Unix 风格的 shell,你可以在 Windows 上运行它来使用 Unix 风格的构建工具,比如 configure 和 make。

对于其中任何一个,您都必须阅读我上面链接的操作指南,以了解如何搜索依赖路径。我犹豫在这里解释它,因为它已经在 howtos 中进行了解释,并且复制该信息不是一个好主意。如果您在阅读后有具体问题,我很乐意提供更多帮助。

【讨论】:

    【解决方案4】:

    由于我花了几个小时研究 SO 才能让这个第 3 方在 MinGW 下运行,所以一个明显的例子可能会帮助像我一样对这个主题不熟悉的其他人。问题是如何添加第 3 方库,答案是:您最好不要真正添加它们,您只需将它们用作参数(如 @anon 所述)。 我参考@kjoppy 的链接推荐。来自http://mingw.org/wiki/IncludePathHOWTO,底部:

    作为选项 (2) 的变体,创建一个单独的目录层次结构, 对于每个单独的外部库包都在本地 已安装;这减轻了选项 (1) 的所有缺点,并且 选项(2)的包混合,但它会产生一个替代方案 惩罚:--与选项(2)一样,适当的“-I DIR”和“-L DIR” 必须将选项添加到每个 GCC 调用中;然而,而选项 (2) 每种类型只需要一个额外的路径,这个选项 对于每个外部,每种类型都需要一个额外的 要部署的库。 (虽然这仍然可以通过 适当定制 GCC 规范文件,或通过适当的 指定 CPATH 和相关的环境变量,附加的 复杂性和维护开销可能被认为是不可接受的 对许多用户)。

    总结起来,他们说 GCC Specs File 或 CPATH 作为“真正的 3rd 方库集成”的选项对于“普通”用户来说额外的维护开销太大了,我们宁愿像下面的例子那样调用:

    你好.c:

    #include <stdio.h>
    #include <mysql.h>
    int main()
    {
        printf("Hello world\n");
        return 0;
    }
    

    我使用 mariadb 连接器包含 mysql.h,其中包含和 lib 与 gcc 默认值分开保存。这可以从命令行调用(I 是包含,L 是库,这些字母后面的空格是可选的)

    gcc -o hello hello.c -I "C:\\Program Files\\MariaDB\\MariaDB Connector C 64-bit\\include" -L "C:\\Program Files\\MariaDB\\MariaDB Connector C 64-bit\\lib\\" -lmariadbclient
    

    如果您想在 VS Code 中运行构建任务,我建议使用扩展 C/C++ 编译运行(扩展 id:danielpinto8zz6.c-cpp-compile-run) 按 F7 然后只输入参数:

    -I "C:\\Program Files\\MariaDB\\MariaDB Connector C 64-bit\\include" -L "C:\\Program Files\\MariaDB\\MariaDB Connector C 64-bit\\lib\\" -lmariadbclient
    

    而 c_cpp_properties.json 必须如下所示:

    {
        "configurations": [
            {
                "name": "Win32",
                "includePath": [
                    "${workspaceFolder}/**",
                    "C:\\Program Files\\MariaDB\\MariaDB Connector C 64-bit\\include"
                ],
                "defines": [
                    "_DEBUG",
                    "UNICODE",
                    "_UNICODE"
                ],
                "compilerPath": "C:\\Program Files (x86)\\mingw-w64\\i686-8.1.0-posix-dwarf-rt_v6-rev0\\mingw32\\bin\\gcc.exe",
                "cStandard": "c11",
                "cppStandard": "gnu++14",
                "intelliSenseMode": "clang-x86"
            }
        ],
        "version": 4
    }
    

    这是重复此处的一些答案或其他类似问题,但它们对我的帮助不足以真正快速开始,这就是我发布新答案的原因。

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2013-09-30
      相关资源
      最近更新 更多