最近的一个项目中遇到了一个问题,C++的一个动态库在我自己的电脑上可以被C#程序引用,我把程序安装到其他电脑上出现了异常,提示找不到DLL,偶然间发现我安装vsc++,C#的程序就不会报错。因为这个C++的动态库是我根据c++的静态库自己封装的。在查阅了资料之后,我尝试着改变代码生成的方式,居然成功了。记录一下我的解决方案。
修改运行库的模式为 MT模式,即可解决问题。
各个设置选项代表的含义
编译选项 |
包含 |
静态链接的lib |
说明 |
/MD |
_MT、_DLL |
MSVCRT.lib |
多线程、Release、DLL版本的运行时库 |
/MDd |
_DEBUG、_MT、_DLL |
MSVCRTD.lib |
多线程、Debug、DLL版本的运行时库 |
/MT |
_MT |
LIBCMT.lib |
多线程、Release版本的运行时库 |
/MTd |
_DEBUG、_MT |
LIBCMTD.lib |
多线程、Debug版本的运行时库 |
简单的说:
(1)/MD,表示运行时库由操作系统提供一个DLL,程序里不集成。
(2)/MT,表示运行时库由程序集成。
/MD、/MT的选择
1、为什么选择/MD,不选/MT?
(1)程序就不需要静态链接运行时库,可以减小软件的大小;
(2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题;
(3)用户机器可能缺少我们编译时使用的动态运行时库。(补充:如果我们软件有多个DLL,采用/MT体积增加太多,则可以考虑/MD + 自带系统运行时库)
2、为什么选择/MT,不选择/MD?
(1)有些系统可能没有程序所需要版本的运行时库,程序必须把运行时库静态链接上。
(2)减少模块对外界的依赖。
3、多个模块,必须选择相同的运行时库。
参考:https://www.cnblogs.com/cswuyg/archive/2012/02/03/2336424.html