我正试图在Microsoft Windows上理解这个LIB文件业务,我刚刚发现了一个发现 - 我希望 - 消除迄今为止阻止我清楚地掌握这个问题的混乱.也就是说,LIB文件不是他们的文件扩展名表明的那种文件.
:: cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib"
:: lib /nologo /list Ad1.Lib
obj\i386\activdbgid.obj
obj\i386\activscpid.obj
obj\i386\ad1exid.obj
obj\i386\dbgpropid.obj
obj\i386\dispexid.obj
:: lib /nologo /list oledb.lib
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbnewiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\cmdtreeiid.obj
o:\winmain.obj.x86fre\enduser\…\oledb\uuid\objfre\i386\oledbdepiid.obj
:: lib /nologo /list AdvAPI32.Lib | sort | uniq -c
731 ADVAPI32.dll
Run Code Online (Sandbox Code Playgroud)
前两个示例包含目标文件(在lib.exe
实用程序显示时显示为相对路径或绝对路径).但是,第三个示例仅包含对DLL的731个引用.(我想lib.exe
这不是为了显示这种文件的更多有用信息.)
一些包含目标文件,它们是静态库.其他包含符号,它们是导入库.(这里有一个简短的解释.)
因此,静态库似乎是.a
Linux 上文件的等价物,而DLL似乎映射到.so
Linux 上的文件.(顺便说一下,导入库如何适应这个Windows/Linux等效图片?)
现在我想知道为什么会这样?为什么Microsoft决定为导入库提供与静态库相同的文件扩展名?(我理解,从历史上看,静态图书馆是第一位的,就像原始形式的生活先于更复杂的形式.)为什么他们不会说,好吧,这些是新的图书馆,他们应该被称为进口图书馆,他们应该承担文件扩展名.ILB
(或其他)?
在链接方面有一些我不理解的事情......我正在使用第三方库(GEOS库)编写程序.此程序依赖于geos.lib但仍需要运行geos.dll.
我读了这个问题,我想我理解静态库和动态库之间的区别.我不明白的是为什么我静态链接库时仍然需要一个dll.
一般认为静态库的性能大于动态库的性能.我的问题是:一旦dll已经加载到内存中,它还依赖于它吗?我的意思是,一旦初始化和所有事情发生,动态库的函数调用和执行是否比静态库需要更长的时间?
我想知道Visual Studio,其他IDE以及任何其他类型的环境(即根本没有IDE)如何处理来自外部的代码.
起初我认为#includes是唯一的方法,通过将汇编文件放在Visual Studio汇编文件的指定目录中,然后使用<>格式将它们引入,或者将汇编文件放在项目中目录并使用""格式将它们带入(即分别为<>和"").但是现在我在这篇文章的最后给出了#using指令的例子(注意,它不同于'using'指令而没有'#',用于命名空间).另外,我在"配置属性"对话框中遇到了在visual studio中添加程序集引用.
那么,有人会让我直接了解在给定项目中添加汇编文件和其他代码的所有内容吗?
- 以下是让我困惑的例子 - >我的书中有这一部分说明:
"......该图将C++ 2008代码与传统C和本机C++代码结合在一起.它还提供了最常用于C++ 2008的两个程序集参考文件及其相关的命名空间.与使用Visual Studio开发时不同在编写单个源文件时,默认情况下不包含程序集引用文件.因此,必须为这些文件编写#using指令...."
#include <stdio.h>
#include <iostream>
#using <system.dll>
#using <system.windows.forms.dll>
// Associated namespace directives
using namespace std;
using namespace System;
using namespace System::Windows::Forms;
void main()
{
printf( "Hello, Earth\n"); // from stdio.h
cout << "Hello, Mars\n"; // from iostream
Console::WriteLine("Hello, Jupiter"); // from system.dll
MessageBox::Show ("Hello, Saturn"); // from system.windows.forms.dll
}
Run Code Online (Sandbox Code Playgroud)