在X64系统上,用VS2013编写了一个C++动态链接库,里面提供了一个导出函数SGFYS。
编译为DLL之后,我们用C#对其动态链接库进行调用,调用代码如下:
此时会被提示,试图加载不正确的格式。我们对该.NET项目属性进行配置,右键该项目--属性--生成--目标平台修改为(x86)
之后再次调用,已经可以被正确调用。
此时我们将该程序放到XP下运行,会报错“找不到指定模块”。
我们用 Dependency walker加载该DLL,发现缺少依赖MSVCR120D.DLL
导致上述问题的原因是运行库动态编译和静态编译的问题。dll动态加载有个好处,它可以减少生成的exe文件的体积,但是缺点就是如果对应的系统环境变量或者exe所在的目录里面找不到其所需要的dll文件的话,程序就会拒绝执行。而静态编译就是把所有需要的库都静态编译到exe文件里面,这样就可以在所有的系统平台上都能运行,但它也有一个缺点,就是生成的exe文件因为已经带了部分库的代码,所以体积会相对动态编译出来的exe大(具体大多少要根据库的内容才能确定)。
解决方法:
右击相应的项目,选择“属性”,在项目属性页中的“配置属性”下面的“C/C++”下面的“代码生成”一项,由默认的“多线程调试DLL(/MDd)”,改成“多线程 (/MT)”,确定之后,重新生成项目即可。这样所得的exe文件就是静态编译了。
时间: 2024-10-17 18:23:51