.dll 文件和中间 .lib 的构造
Construction of a .dll file and the intermediate .lib
以下摘自link1.
Microsoft introduced __export in the 16-bit compiler version of Visual
C++ to allow the compiler to generate the export names automatically
and place them in a .lib file. This .lib file can then be used just
like a static .lib to link with a DLL. In newer compiler versions, you
can export data, functions, classes, or class member functions from a
DLL using the __declspec(dllexport) keyword. __declspec(dllexport)
adds the export directive to the object file so you do not need to use
a .def file.
我对上面的段落有一定的了解,但不是很了解。
以下摘自link2.
When building the DLL, the linker uses the .def file to create an
export (.exp) file and an import library (.lib) file. The linker then
uses the export file to build the DLL file. Executables that
implicitly link to the DLL link to the import library when they are
built.
现在,这让我感到困惑并提出以下问题:
谁能用简单的话告诉我 exporting 这个词是什么意思
真正意思?我相信这是使一个对象可以从一个
一段代码给其他人 - 但是嘿!!
在使用旧库构建项目时,我看到的大多数是 .def 文件
他们中的。但是最新的编译器会自动导出对象。将
.def 文件的存在会在转换旧版本时引起任何冲突
版本 visual studio 项目到较新版本?
生成后的.lib(所谓导入文件)有什么用
的.dll。能安全删除吗?
啊啊!!静态库(.lib)和导入库(.lib)有什么区别?失误吧?但还是!!
windows是具体现象吗?我相信不是。所谓的导入文件的 Linux 副本是什么?
如果问题还不是很清楚,请随时重新措辞。
tell me what the term exporting really means?
它只是告诉 linker 它需要将一个条目放入 DLL 的导出 table。操作系统加载器稍后使用它在运行时将不同模块中的代码粘合在一起。
I see .def file in majority of them
可能是非常的旧项目。或者它从未作为旨在创建单独模块的项目启动。像静态库一样,源代码没有 __declspec
属性。跨平台库很可能符合该要求。 C 和 C++ 语言规范仍然没有以标准化方式创建模块的方法。每个人都这样做,没有人以同样的方式做。大量时间流失。
What is the use of the .lib(the so called import file)
项目中需要使用DLL。 linker 需要知道标识符位于另一栋建筑物中,无法在 link 时解析。它在操作系统加载程序使用的另一个 table 中放置一个条目,导入 table。这是一个非常的简单文件,它只列出了导出标识符的名称。理论上,linker 可以使用 DLL 本身来解决这个问题。实际上这不起作用,因为导出的名称不必与实际名称匹配。
What is the difference between a static library(.lib) and import library(.lib)
静态库包含 link 编辑到使用该库的项目中的代码。导入库不包含代码,只是提示代码在其他地方可用。
Is the windows specific phenomenon?
大致上,是的。 Unix 有相同的概念,但实现方式却大不相同。
以下摘自link1.
Microsoft introduced __export in the 16-bit compiler version of Visual C++ to allow the compiler to generate the export names automatically and place them in a .lib file. This .lib file can then be used just like a static .lib to link with a DLL. In newer compiler versions, you can export data, functions, classes, or class member functions from a DLL using the __declspec(dllexport) keyword. __declspec(dllexport) adds the export directive to the object file so you do not need to use a .def file.
我对上面的段落有一定的了解,但不是很了解。
以下摘自link2.
When building the DLL, the linker uses the .def file to create an export (.exp) file and an import library (.lib) file. The linker then uses the export file to build the DLL file. Executables that implicitly link to the DLL link to the import library when they are built.
现在,这让我感到困惑并提出以下问题:
谁能用简单的话告诉我 exporting 这个词是什么意思 真正意思?我相信这是使一个对象可以从一个 一段代码给其他人 - 但是嘿!!
在使用旧库构建项目时,我看到的大多数是 .def 文件 他们中的。但是最新的编译器会自动导出对象。将 .def 文件的存在会在转换旧版本时引起任何冲突 版本 visual studio 项目到较新版本?
生成后的.lib(所谓导入文件)有什么用 的.dll。能安全删除吗?
啊啊!!静态库(.lib)和导入库(.lib)有什么区别?失误吧?但还是!!
windows是具体现象吗?我相信不是。所谓的导入文件的 Linux 副本是什么?
如果问题还不是很清楚,请随时重新措辞。
tell me what the term exporting really means?
它只是告诉 linker 它需要将一个条目放入 DLL 的导出 table。操作系统加载器稍后使用它在运行时将不同模块中的代码粘合在一起。
I see .def file in majority of them
可能是非常的旧项目。或者它从未作为旨在创建单独模块的项目启动。像静态库一样,源代码没有 __declspec
属性。跨平台库很可能符合该要求。 C 和 C++ 语言规范仍然没有以标准化方式创建模块的方法。每个人都这样做,没有人以同样的方式做。大量时间流失。
What is the use of the .lib(the so called import file)
项目中需要使用DLL。 linker 需要知道标识符位于另一栋建筑物中,无法在 link 时解析。它在操作系统加载程序使用的另一个 table 中放置一个条目,导入 table。这是一个非常的简单文件,它只列出了导出标识符的名称。理论上,linker 可以使用 DLL 本身来解决这个问题。实际上这不起作用,因为导出的名称不必与实际名称匹配。
What is the difference between a static library(.lib) and import library(.lib)
静态库包含 link 编辑到使用该库的项目中的代码。导入库不包含代码,只是提示代码在其他地方可用。
Is the windows specific phenomenon?
大致上,是的。 Unix 有相同的概念,但实现方式却大不相同。