编译器是不是能够对从 dll 导入的函数进行程序集成?

Posted

技术标签:

【中文标题】编译器是不是能够对从 dll 导入的函数进行程序集成?【英文标题】:Is compiler able to do a procedural integration of functions imported from dll?编译器是否能够对从 dll 导入的函数进行程序集成? 【发布时间】:2010-05-10 01:30:03 【问题描述】:

我知道,现代编译器不仅可以对内联定义的函数进行过程集成,还可以对驻留在目标文件中的函数进行过程集成。但是,当您针对共享库(尤其是 dll)编译程序时,这是否也是如此?粗略地说:如果需要,是否会将函数代码从 dll 复制到可执行文件中?

【问题讨论】:

【参考方案1】:

不,因为编译器没有构成这些函数的代码。

在 Windows 上,当你链接到一个动态库时,你通常会包含一个头文件和一个导入库的链接,它只包含加载动态库和获取你调用的函数的指针的代码(从技术上讲,你不需要'不需要导入库,也可以手动调用LoadLibrary()和朋友)。

由于编译器永远不会看到动态库本身的代码,它当然不能对代码进行内联扩展。

【讨论】:

所以,我认为内联定义琐碎的方法(例如访问器)而不是将其琐碎的主体放入 dll 的二进制文件中并不是一个坏主意?假设该库不是二进制兼容的,并且每个版本都会重新编译源代码。并且不会在运行时加载! @doc:我通常在头文件中定义简单的方法。但是,我不完全知道使用 dllexport 声明某些内容可能会如何影响优化器的行为(即,它可能会导致优化器显式地不执行内联扩展)。我将不得不对此进行一些研究。 我已经可以告诉你,至少在 g++ 中,影响 dllexport 的是内联 - 内联定义的方法不会导出到符号表中,它们的二进制代码也不会导出(但是你必须在旁边声明它们内联正在导出的类的类内声明(这是常见问题规则 [9.9] 不适用的地方parashift.com/c++-faq-lite/inline-functions.html#faq-9.9))。当然如果他们愿意会更好,但是如果没有程序集成,每个琐碎的 set 或 get 都是通过函数调用机制执行的,这会导致 glVertex() 综合症。 这样做的不利之处在于,更多的内部数据结构会作为库的 ABI 的一部分暴露出来,从而首先消除了使用 setter/getter 函数的大部分意义。跨度>

以上是关于编译器是不是能够对从 dll 导入的函数进行程序集成?的主要内容,如果未能解决你的问题,请参考以下文章

请问asp.net dll 编译时 找不到类型或命名空间名称“名称”(是不是缺少 using 指令或程序集引用你如何解决了

易语言dll劫持注入写法

DLL生成与使用的全过程

无法加载文件或程序集'System.ValueTuple'

C#.Net 如何动态加载与卸载程序集(.dll或者.exe)3---- 动态加载Assembly应用程序

将 protobuf-net RuntimeTypeModel 编译为 C#,而不是 DLL