【问题标题】:How does linker finds standard and WinAPI functions?链接器如何找到标准和 WinAPI 函数?
【发布时间】:2015-03-20 09:06:27
【问题描述】:

当我想使用标准 C/C++ 库中的某些内容时,我可以只包含适当的头文件并使用该函数。 WinAPI 函数也是如此。

我了解编译器如何找到这些头文件 - 它会在本地搜索它们,然后如果没有找到,则在一些预定义的系统文件夹中查找。

但我不知道链接器是如何找到这些库的,因为我没有以任何方式包含它们...

【问题讨论】:

    标签: c++ c windows linker


    【解决方案1】:

    如果您使用默认设置的 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") 包含一个库。
    【解决方案2】:

    链接器只是有一个标准库随编译器本身一起提供。
    例如,如果您安装了 GNU GCC,您将看到一个文件夹 lib,其中包含链接器用来链接您的代码的所有静态库。

    如果您需要告诉链接器使用特定库或其他地方的一些静态库,您始终可以使用 -l-L 标志(对于 GNU GCC)来表明您希望链接器使用一个特定的库或库文件夹。

    【讨论】:

    • 我知道这些库实际上位于某个文件夹中,但是链接器如何为我在代码中使用的函数找到合适的 lib 或 dll?它只是在每个 dll 导出表中按名称搜索吗??
    • @SkySurfer 它将建立某种内部查找表,其中包含所有链接库中所有内容的名称。如何在链接器内部完成此操作可能会因产品而异。 GCC 链接器应该是开源的,所以你可以继续看看它是如何在那里完成的。 (就个人而言,我不太关心它是如何完成的,只要它有效)
    • 对于链接器如何与库一起工作的一般概述,谷歌快速搜索显示:lurklurk.org/linkers/linkers.html#linker2
    猜你喜欢
    • 2017-05-30
    • 2012-02-12
    • 2013-05-22
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多