2010-06-09 77 views
0

在Visual Studio(C++)有一天,我试图构建一些示例代码,它不会工作,即使我指向正确的包含和lib目录(我有链接器错误)。链接是否不够?

我通过在项目设置的常规属性 - >连接器 - >输入字段中指定必要的.lib文件,询问解决问题的朋友。

我的问题:

是不是简单地指向与.lib文件足够的目录?你需要专门告诉链接器哪些lib文件链接?

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

回答

2

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

一旦编译成功,你就得到了一个包含一堆符号的对象代码。为了使对象代码有用,这些符号实际上需要引用某些东西。这就是链接器所在的位置 - 它解析了您刚刚编译的代码中的符号,与您正在使用的二进制库中的对应代码对应。

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

我实际上并没有使用Visual Studio,但根据this MSDN article,VS默认链接到LIBC.LIB和一大堆其他库。如果您正在使用其他一些默认未链接的静态库,那么这是一个附加的依赖关系。

0

这是正确的,只需指向一个目录不会导致该目录中的.libs被链接(考虑Visual Studio'lib'文件夹的情况:我的版本中有60个文件:想象如果他们都被链接到了!)

它被称为“附加”,因为通常会自动链接标准C++运行库。各种各样的#pragma也可能导致图书馆自动链接(这是库如增强做它)。