C#中使用OpenGL:(三)将.lib文件编译为.dll文件

C#不能调用C/C++lib文件的函数,但能调用dll文件的函数。可是现在的情况是,我只有一个lib文件,函数的实现都在里边了。能不能把lib变为dll呢?答案是肯定的。
要把lib编译为dll大概有三种方法吧:
第一种,就是把lib的函数封装一下,然后用编译器编译为dll。具体做法就是,先定义一个函数,然后在函数内部引用lib中的函数,最后将函数输出到dll文件中。
例如:

void FUNC()
{
    func();//lib文件中的一个函数被引用
}

这种做法容易想到,但不推荐这样做。因为这样做就是给lib中的函数加了一层壳,本来调用一次函数,相当于调用两次,效率降低。
第二种,使用VS提供的工具lib.exe将lib的函数分离成obj文件,然后使用link.exe工具将obj连接输出为dll。这种方法比较麻烦,这里不详细介绍。
第三种,利用link.exe工具,直接将lib生成dll。这种方法相对简单,而且很有效,所以,本文将详细介绍这种方法。

将lib直接编译为dll

在Visual studio 中,可以将函数输出到dll文件中,但我摸索了很久也没能实现将lib直接转为dll。我查了很多资料,发现VS提供的工具link.exe却是可以直接将lib转为dll的。
如果已经安装了VS集成开发环境,那么可以在VS安装路径下的VC/bin文件夹找到link.exe。例如我将VS安装在C:\Microsoft Visual Studio 14.0目录中,link.exe所在的位置:

C:\Microsoft Visual Studio 14.0\VC\bin

这个link.exe是可执行文件,但不能直接运行,而要在命令行中运行。

如何使用link.exe?

要使用link.exe将lib输出为dll,需要经过几个步骤。
1.首先,要配置环境变量
将下面的路径添加到用户环境变量或系统环境变量Path中:
C:\Microsoft Visual Studio 14.0\VC\bin
C:\Microsoft Visual Studio 14.0\Common7\IDE
2.其次,在命令行中运行 C:\Microsoft Visual Studio 14.0\VC\bin目录下的vcvars32.bat。

正确做完这两步工作之后就可以使用link.exe工具将lib输出位dll了,如果配置不正确,就会提示“无法打开XXX.lib”等错误。
若想了解更多,可以参考:http://blog.sina.com.cn/s/blog_842bf5cd01017a0k.html

3.第三,编写def文件。
def文件用来告诉link.exe将要输出那些函数。
首先新建一个文本文件,文件名可以任意取,比如我命名为mydll。
然后,将后缀名改为def。于是整个文件就变为mydll.def。
最后,编辑mydll.def文件。文件中包含如下内容:

LIBRARY "xxxx"
EXPORTS
函数一
函数二
函数三
.....

xxx就是你将要输出的dll的文件名。EXPORTS后面是将要输出的函数名,想要输出多少函数,就写多少。比如,mylib.lib文件中的两个函数为Add和Multi,我要将它们输出到mydll.dll中,则def文件可以这样写:

LIBRARY "mydll"
EXPORTS
Add
Multi

如果,不知道lib文件中有哪些函数怎么办?这时可以使用VS提供的dumpbin.exe来查看lib文件的函数名。
打开命令行窗口,输入cd C:\Microsoft Visual Studio 14.0\VC\bin命令,可以将盘符移动到C:\Microsoft Visual Studio 14.0\VC\bin文件夹下,这样命令行就可以运行dumpbin.exe了。

这里写图片描述

输入命令dumpbin “文件名” /ALL。文件名是将要查看的文件名称,后缀是lib、dll、obj的文件都可以查。我要查看myLib.lib中的函数名称,操作如下:

这里写图片描述

查看结果:

这里写图片描述

从查看的结果来看,myLib.lib文件中有两个函数,函数名称分别为_Add和_Multi。这两个函数名称被修饰了,都加了下划线,原来应该为Add和Multi。

4.第四,写好def文件之后,下一步就是利用link.exe将myLib.lib中的函数输出到mydll.dll中。为了方便起见,把mydll.def文件和mylib.lib文件都复制到C:\Microsoft Visual Studio 14.0\VC\bin文件夹下。然后在命令行中输入命令:

//进入目录C:\Microsoft Visual Studio 14.0\VC\bin
cd C:\Microsoft Visual Studio 14.0\VC\bin

//打开批处理文件vcvars32.bat
vcvars32.bat

//输入link命令
link myLib.lib /DLL /DEF:mydll.def /OUT:mydll.dll

命令行进入某个目录的命令是“cd”,后面跟目录名称。值得注意的是,使用link命令时,“/”前一定要有一个空格,否则命令将无法被识别。/DLL前有一个空格,/DEF前也有一个空格。

按回车,如图:

这里写图片描述

执行结果:

这里写图片描述

如果命令输入正确,那么可以看到生成三个新的文件:mydll.lib、mydll.dll 、mydll.exp。其中,mydll.dll就是我想要的东西。

这里写图片描述

使用depends工具查看mydll.dll中的函数,看看有没有正确生成。

这里写图片描述

可以看到,mydll.dll文件中确实存在Add和Multi函数,而且对mydll.dll的调用也是成功的。这证明,通过命令行运行link.exe工具确实可以将lib文件转为dll文件。

注意事项:

1.使用link.exe工具之前一定要配置好环境变量;
2.每次使用link.exe连接lib文件都要先在命令行中打开vcvars32.bat;

结语:

事实上,在网上下载的OpenGL库,一般都包括了dll文件,没有必要费神将lib文件转化为dll文件。OpenGL库都有好几百个函数,如果要一个个把函数名写进def文件中也是很费力气的,而且很容易出错。本文虽然研究了如何根据lib文件生成dll文件,但实际操作的过程中,我不会用这种方法将OpenGL的静态链接库转化为动态链接库,而是直接使用已有的dll。人都是懒惰的!

上一篇:C#中使用OpenGL:(二)C#调用C/C++的dll
下一篇:C#中使用OpenGL:(四)C#版的OpenGL常量

猜你喜欢

转载自blog.csdn.net/qq_28249373/article/details/77373503