如何在g ++中静态包含库?

时间:2011-12-13 04:18:23

标签: dll g++ static-linking

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

我意识到经过几年的CS课程和项目之后,我从来没有真正需要导出其他人可以在不编译源手动的情况下运行的可执行文件(这是大多数/所有教授/ TA所做的,因为他们想要看到你的源代码。)

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

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

  • Visual Studio需要.NET框架。
  • Cygwin需要Cygwin.dll。
  • MinGW需要libgcc_s_dw2-1.dll或类似内容。

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

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

无论如何,所有的帮助都表示赞赏。

编辑:

我真的在谈论Hello World计划。 e.g:

HelloWorld.cpp:

#include <iostream>
using namespace std;

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

    return 0;
}

4 个答案:

答案 0 :(得分:1)

尝试g ++ -static -static-libgcc

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

以下是: 简而言之,您指定将所有标准内容链接到您的可执行文件中。

g++ -o c:\prog.exe c:\HelloWorld.cpp -static-libgcc -static-libstdc++
希望它有所帮助。