在gcc中的静态链接(mingw)

问题描述:

我想链接到由22个静态库(.a)文件组成的外部库。当我使用visual studio时,我只需要将目录传递给VS,它将链接到目录中的文件。用gcc我首先想到的是,在gcc中的静态链接(mingw)

-LC:\...\directory_of_library -lsth1 -lsth2 -lsth3 ... -lsth22 

,我试图找到一个更好的办法比。

此外,会有'overlinking'的问题吗?因此与更多的图书馆联系在一起超过必要或者编译器会聪明地忽略冗余部分?

+0

“试图找到比”更好的方式“ - 因为它不起作用? – 2014-09-01 21:32:39

+0

,因为我很懒,我不喜欢打太多的东西,当然肯定有效:) – MinjaeKim 2014-09-01 21:36:33

+0

你其实已经问了两个问题。第二个也许是合法的和有趣的,第一个只是微不足道的,容易导致第二个被忽视,并承认它是由懒惰引起的,会吸引下流。你花了更多的时间输入问题,而不是在一个IDE项目或makefile中输入* once *。 – Clifford 2014-09-01 21:50:29

当连接扫描库文件,它只链接解析未被早期对象代码或库解析的符号所需的对象代码。来自存档的未引用对象代码将不会被链接。

指定冗余库可能会延长构建时间。您可以通过首先指定最常用的库来帮助解决问题,但除了最大的项目之外的所有项目都不太可能是重要的。

1)您的命令只是“链接”。现在情况很好。 2)“静态”链接意味着指定“-Bstatic”,或者指定一个静态的“.a”库。

这里有几个不错的链接解释 “静态” 与 “动态” 链接:

+0

你能再解释一下吗?我目前对静态和动态链接的深入理解是,前者将在编译时引用预编译的.a或.lib文件,并构成一个大的可执行文件,而后者则表示.dll或.so(?)文件必须单独设置才能与可执行文件一起运行。简单的“链接”有什么不同? – MinjaeKim 2014-09-01 21:43:26

+0

您对.a/lib(静态)与.so/.dll的理解完全正确。我急于补充说,动态库是一件好事。 “链接”将对象模块(.o/.obj),静态和动态库的任意组合绑定到可执行文件(.exe)中。最后注意:链接器自动只包含最终可执行文件中的“需要”。共享库有额外的好处,即“需要什么”在运行时确定。 .so的/ .dlls可以在正在运行的进程之间“共享”。这可能导致内存使用效率很高。 – FoggyDay 2014-09-01 21:55:44