依赖关系不够连接吗?

时间:2010-06-09 03:13:45

标签: visual-studio dependencies static-libraries

前几天在Visual Studio(C ++)中,我试图构建一些示例代码并且它不起作用,即使我指向正确的include和lib目录(我有链接器错误)。

通过在项目设置的General Properties-> Linker-> Input字段中指定必要的.lib文件,我问了一位修复问题的朋友。

我的问题:

是不是简单地指向带有.lib文件的目录?您是否需要专门告诉链接器链接哪些lib文件?

通过列出additional dependencies字段中的.lib文件,我是否准确指定了哪些静态库内置到exe中?如果对此的答案是肯定的,那么这些是构建到exe中的唯一lib文件吗?为什么称它为additional依赖项?是否有另一个地方指定要包含的lib文件?我曾经认为这是通过包含必要的头文件来完成的。

2 个答案:

答案 0 :(得分:2)

在源代码中包含标头使得该标头的声明可供编译器使用。如果编译器找不到您使用的库函数(常量,宏等)的声明,则它无法生成引用该函数的对象代码。

一旦编译成功,你就会得到包含一堆符号的目标代码。为了使目标代码有用,这些符号实际上需要引用某些东西。这就是链接器的用武之地 - 它将您刚刚编译的代码中的符号解析为您正在使用的二进制库中的相应目标代码。

所以,是的,您确实需要告诉链接器链接哪些.lib文件 - 类似于您告诉编译器(通过#include指令)引用哪些头文件的方式。如果链接器无法解析符号,则链接将失败(我猜测是您获得的链接器错误)。

我实际上并不使用Visual Studio,但根据this MSDN article,VS默认链接到LIBC.LIB和一大堆其他库。如果您正在使用默认情况下未链接的其他静态库,则这是一个额外的依赖项。

答案 1 :(得分:0)

这是正确的,只需指向一个目录就不会导致该目录中的.libs被链接进去(考虑Visual Studio'lib'文件夹的情况:我的版本中有60个文件:想象一下所有人都联系在了!)

它被称为“附加”,因为通常会自动链接标准C ++运行时。各种#pragma s也可以导致库自动链接(这是像boost这样的库)。