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

7
正如标题所述,这是一个真正初学者的问题。
我意识到,在参加了几年的CS课程和项目等之后,我从来没有真正需要导出可以让别人在不手动编译源代码的情况下运行的可执行文件(这也是大多数/所有教授/TAs的做法,因为他们想要查看你的源代码)。
因此,我的问题基本上就是:
当我编译一些基本的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;
}
4个回答

1

尝试使用 g++ -static -static-libgcc


1

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

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

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


0

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

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

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


0

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

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

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接