最近在做一个项目,起初这个项目由一个exe和几个动态库组成,现在想将部分动态库转换为静态库,于是在VS2010中鼠标停靠到项目名上右键->属性->配置属性->常规->项目默认值->配置类型,将动态库(.dll)改为静态库(.lib),重新编译该项目,编译成功,但是再重生成exe时却出现很多链接错误;修改一通之后还未能解决问题;于是静下心来写了一个测试工程;
工程里有A,B两个项目,A为控制台应用程序,B为win32动态库,B中写了一个简单的函数__declspec(dllexport) int myAdd(int a,intb)
{
Return a+b;
}
在A中调用并输出结果没问题,
然后将B的项目类型改为静态库,重新生成A,出现连接错误;仔细检查发现myAdd 声明时前面有一个__declspec(dllexport)这是动态库导出函数用的,去掉__declspec(dllexport)重新生成B,A成功,运行没问题,小兴奋了一下。
然后将原项目中的所有__declspec(dllexport)删除,重新生成,发现还是有连接错误,百思不得其解,百度谷歌都没找到答案,于是静下心在仔细观察输出错误信息,发现这些连接错误都是静态库调用系统或d3d的函数找不到并没有说静态库的导出函数找不到,于是恍然大悟,静态库中调用其他动态库时,是按动态库的规则调用的,将静态库所引用的库文件放在需要调用这些静态库的DLL或EXE中的链接->输入中再重新生成,成功,在兴奋,运行没问题,再兴奋;
说的比较模糊总结一下将现有的dll转换为静态库,有两点需要注意
1:将动态库导出函数的声明前的__declspec(dllexport)去掉,这样链接时就不会找不到静态库的导出函数;
2:将动态库所引用的库文件,在调用该库的exe或dll中引用(尽管这些项目并没有直接引用这些库文件)这样就可以避免在连接时找不到静态库引用动态库中的函数。
Vs2010 中FFMPEG静态库的使用
首先将ffmpeg的静态库在mingw环境下编译成功,注意产生的静态库名字是lib***.a的形式,而不是.lib文件。
在项目中连接->输入如下库
libgcc.a
libmingwex.lib
libavcodec.a
libavformat.a
libavutil.a
libswscale.a
libz.a
libbz2.a
libpthreadGC2.a
其中libmingwex.lib
用以下方法得到;
1、首先运行cmd,在cmd中执行vs安装目录下vc /bin中的vcvars32.bat(我的电脑的路径是C:\ProgramFiles (x86)\Microsoft Visual Studio 10.0\VC\bin),配置vs环境,注意配置的环境只在当前cmd窗口中有效。
2、运行
cd C:\msys\1.0\mingw\lib
进入mingw的目录,具体路径根据自己安装的环境而定只要进入libmingwex.lib
所在目录就可以
3、运行
lib –remove:mbrtowc.o libmingwex.a
lib –remove:mcrtomb.o libmingwex.lib
这时生成的libmingwex.lib即可使用