关于g ++,linux和windows上的动态和静态链接的误解

时间:2011-07-25 04:44:24

标签: c++ g++ mingw dynamic-linking static-linking

我对今天学到的东西感到有些困惑。我希望有人可以帮助我。

我理解动态和静态链接的概念,但问题如下。在Windows上,或者至少是windows上的范例,你可以有一个.lib(就像.a)和.dll(就像.so,除了...不同),你必须在.lib中静态链接。包含在运行时从dll调用函数的代码。它是否正确?换句话说,gcc或g ++必须在编译/链接时具有.lib文件,并且能够在运行时找到.dll文件。请在此纠正任何错误的假设。

但是,我在我的小应用程序中拆分了一些源文件,因为我想让它们成为一个库。当我在我的目标文件上使用-shared选项运行g ++时,这基本上创建了一个共享库(.so)?这就是出现混乱的地方。 相同的 so文件在链接时和运行时需要 吗?我在链接时无法理解我在-L / -l选项中的需要,但它仍然需要运行时的文件。这实际上是常态吗? dll根本不同吗?

最后,最后一个问题。在Windows上使用像boost这样的库。我根据指示建立了提升。最后,stage / lib目录包含name.a,name.dll.a,name.dll的重复序列中的库。这个计划的目的是什么?我知道我需要在运行时使用dll文件,但是当我在链接时使用-L / -l选项时,它会使用那些文件吗?

对不起,如果这真的很分散,但我希望有人可以帮忙解决这个问题。非常感谢!

2 个答案:

答案 0 :(得分:4)

  

在Windows上,或者至少是Windows上的范例,你可以有一个.lib(就像.a)和.dll(就像.so,除了...不同),你必须静态链接到.lib包含在运行时从dll调用函数的代码。它是否正确?

是和否。这是DLL在Windows上运行的一种方式,但它不是唯一的方法。

您可以使用Win32 API调用手动加载DLL。但是如果你这样做,你必须手动获取函数指针以实际访问DLL。导入库(您正在谈论的静态库)的目的是自动执行此操作。

手动执行它的好处是你可以选择你想要的DLL。这是一些应用程序提供插件支持的方式。用户编写一个DLL,导出一组明确定义的API函数。您的程序从目录加载它们,并将每个DLL的函数指针捆绑到它自己的对象中,该对象表示该插件的接口。

GCC以相同的方式运行,在Windows上。构建DLL会生成DLL和导入库。由于编译器,它是一个“.a”文件而不是“.lib”,但它仍然会做同样的事情。

在Linux上,.so文件是.dll和导入库的组合。因此,在编译相关程序时链接到.so,它与链接到导入库的工作相同。

答案 1 :(得分:0)

这只是在编译时为共享库提供信息的两种方式。也许比较会更好地解释它?

在Windows中,它是:“您将使用共享库(.dll),此处(.a或.dll.a)是如何使用它的手册。”

在Linux中,它是:“你将使用共享库(.so),所以事先看看它(.so),这样你就会知道如何使用它。”