【发布时间】:2015-03-20 09:06:27
【问题描述】:
当我想使用标准 C/C++ 库中的某些内容时,我可以只包含适当的头文件并使用该函数。 WinAPI 函数也是如此。
我了解编译器如何找到这些头文件 - 它会在本地搜索它们,然后如果没有找到,则在一些预定义的系统文件夹中查找。
但我不知道链接器是如何找到这些库的,因为我没有以任何方式包含它们...
【问题讨论】:
当我想使用标准 C/C++ 库中的某些内容时,我可以只包含适当的头文件并使用该函数。 WinAPI 函数也是如此。
我了解编译器如何找到这些头文件 - 它会在本地搜索它们,然后如果没有找到,则在一些预定义的系统文件夹中查找。
但我不知道链接器是如何找到这些库的,因为我没有以任何方式包含它们...
【问题讨论】:
如果您使用默认设置的 Visual Studio 2012,除了 C 运行时,链接器将链接到以下内容:
kernel32.lib 用户32.lib gdi32.lib 胜池.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
右键项目,属性--链接器--输入--附加依赖,可以自己查看列表。
您可以根据需要删除一些或添加一些。
至于 C 运行时,它由 /NODEFAULTLIB 链接器选项控制,更多细节在这里:https://msdn.microsoft.com/en-us/library/3tz4da4a(v=vs.110).aspx
【讨论】:
#pragma comment(lib, "NAME") 包含一个库。
链接器只是有一个标准库随编译器本身一起提供。
例如,如果您安装了 GNU GCC,您将看到一个文件夹 lib,其中包含链接器用来链接您的代码的所有静态库。
如果您需要告诉链接器使用特定库或其他地方的一些静态库,您始终可以使用 -l 或 -L 标志(对于 GNU GCC)来表明您希望链接器使用一个特定的库或库文件夹。
【讨论】: