【问题标题】:How do I statically include a library in g++?如何在 g++ 中静态包含库?
【发布时间】:2011-12-13 04:18:22
【问题描述】:

正如标题中提到的,这是一个真正的初学者问题。

我意识到,经过几年的 CS 课程和项目等,我实际上不需要导出其他人可以在不手动编译源代码的情况下运行的可执行文件(这是大多数/所有教授/助教所做的,因为他们无论如何都想看到你的源代码)。

所以我的问题基本上是这样的:

当我编译一些基本的 C++ 代码(例如“Hello World”代码)时,我似乎总是需要某种外部 DLL 来运行它。

  • Visual Studio 需要 .NET 框架。
  • Cygwin 需要 Cygwin.dll。
  • MinGW 需要 libgcc_s_dw2-1.dll 或类似的东西。

那么我如何简单地编译一个可执行文件,以便我(或我将文件提供给的人)可以双击它并让它运行?我猜我可以在 g++ 上使用一些花哨的命令行标志来静态链接 DLL;我以前根本不需要这样做。

正如我两次所说,这是一个超级初学者的问题,但我无法(很容易,无论如何)找到这个问题的答案,StackOverflow 或其他任何地方。我认为很大程度上是因为搜索词在其他问题的描述中非常常用。

无论如何,感谢所有帮助。

编辑:

我实际上是在谈论 Hello World 程序。例如:

HelloWorld.cpp:

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World!" << endl;

    return 0;
}

【问题讨论】:

    标签: dll g++ static-linking


    【解决方案1】:

    试试 g++ -static -static-libgcc

    【讨论】:

      【解决方案2】:

      但是,您通常应该避免静态链接。通常 Linux 机器上的几乎所有实用程序都是动态链接的:您可以使用 fileldd 来了解可执行文件是否是静态链接的。在我的 Debian/Sid 系统上,/usr/bin/ 包含 7303 个文件,但只有一个是静态链接的(它是 /usr/bin/rar)。

      使用动态链接更好,因为它使用更少的磁盘空间,最重要的是因为动态库是更新的,这对所有动态链接它们的可执行文件有利。

      如果您关心依赖关系,请使用包管理器(或将程序作为包分发)。

      【讨论】:

        【解决方案3】:

        如果您已经获得了需要链接的静态库(.lib 或 .a),只需在链接应用程序时将它们与目标文件放在一起,例如

        g++ foo.o libfoo.a -o foo

        我认为您真正的问题是如何找到您的应用程序需要哪些静态库以及如何获取它们,也许您应该在此处发布您的代码并让我们知道您需要链接哪个库。

        【讨论】:

          【解决方案4】:

          方法如下: 简单地说,您指定将所有标准内容链接到您的可执行文件中。

          g++ -o c:\prog.exe c:\HelloWorld.cpp -static-libgcc -static-libstdc++
          

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2021-07-29
            • 1970-01-01
            • 2012-07-05
            • 1970-01-01
            • 2011-04-14
            • 2013-11-04
            • 1970-01-01
            • 1970-01-01
            • 2021-02-26
            相关资源
            最近更新 更多