SDK开发win32程序时对运行库的调整(多线程编译器选项)

    今天没事干决定练练手,山寨一个记事本。先把界面写了出来。编码,编译都很顺利Debug在本机上跑得也很正常,于是把东西拖到虚拟机里小测一下(本人使用的是脑残的Vista。。。都不好意思说了。。。汗 )。结果...跑不了...

    以为是虚拟的那个XP的问题,又拖到虚拟的Win7里,还是不行。想想可能是虚拟机的问题,于是传给室友,但...还是不行...

    以前写东西的时候也发生过这种状况,基本上只要是Windows程序都有这问题。当时因为是跟小组里的人交流,所以直接就把源代码丢过去让他们自己编译,所以一直没有重视,觉得可能只是编译环境出了问题,只要代码没问题就好了。但是现在不能这样了。只能把这问题解决了。

    经过多方面的查询,了解到可能是动态链接库的关系。由于我这边是开发环境,链接库很齐全,不存在缺少库文件的问题,但是其他的机子就不一定了。

    既然知道问题的原因,解决问题就简单了在编译器里(我的是VS08)选择项目->属性(Alt+F7),然后配置属性->C/C++->代码生成,然后在运行库一项里更改为/MT(默认貌似是/MD)。/MD的定义是在程序运行时调用需要的dll,而/MT的定义是在编译时直接将需要的dll总的需要部分嵌入到exe里。这也就是为什么我起初编译后生成的文件只在本机可以使用。完成调整后重新编译,问题解决。

 

另附MSDN关于Visual C++ 编译器选项的说明(在MSDN中搜索:多线程编译器选项):

这些选项选择单线程或多线程运行时例程,指示多线程模块是否为 DLL,并选择运行时库的发布版本或调试版本。

选项说明
/MD定义 _MT_DLL 以便同时从标准 .h 文件中选择运行时例程的多线程特定版本和 DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中。

用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。

当 在定义了 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 的情况下使用 /MD 时,它将导致应用程序通过静态多线程标准 C++ 库 (libcpmt.lib) 而非动态版本 (msvcprt.lib) 进行链接,同时仍通过 msvcrt.lib 动态链接到主 CRT。

/MDd定义 _DEBUG_MT_DLL ,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本和 DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
/ML使编译器将库名 LIBC.lib 放入 .obj 文件中,以便链接器使用 LIBC.lib 解析外部符号。这是编译器的默认操作。LIBC.lib 不提供多线程支持。
/MLd定义 _DEBUG 并使编译器将库名 LIBCD.lib 放入 .obj 文件中,以便链接器使用 LIBCD.lib 解析外部符号。LIBCD.lib 不提供多线程支持。
/MT定义 _MT , 以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
/MTd定义 _DEBUG_MT 。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。创建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。
/LD创建 DLL。

将 /DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回 TRUE 的 DllMain 函数。

链接 DLL 启动代码。

如果命令行上未指定导出 (.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL 的应用程序。

/Fe 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称 .dll 而不是基名称 .exe。

如果还未显式指定 /M 选项之一,则将默认运行时库支持更改为 /MT。

/LDd创建调试 DLL。定义 _DEBUG
警告     不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内部既使用静态版本又使用动态版本链接,但您仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的 .exe 文件一起使用时,用静态(非 DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。

有关使用运行时库的调试版本的更多信息,请参见运行时库参考。

知识库文章 Q140584 也讨论如何选择适当的 C 运行时库。

有关 DLL 的进一步讨论,请参见 DLL

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值