Chuyu-Team / VC-LTL

Shared to msvcrt.dll and optimize the C/C++ application file size.
Eclipse Public License 2.0
1.05k stars 204 forks source link

WTL与标准库atomic冲突?值“MT_LTL_StaticRelease”不匹配值“MT_StaticRelease” #49

Closed augustheart closed 5 years ago

augustheart commented 5 years ago

又有段时间没写c++了,这次回来发现VC-LTL升级到了4.0,同时我自己装的vs2017也升了一堆版本。然后发现自己以前的项目编译不过了。吭哧吭哧把所有用到的三方库全部重新编译了一遍,最后还是编译不过。这项目是我自己写的一个半成品音乐播放器,使用directaudio,然后链接了一堆解码库,这些都不是重点。 然后我慢慢精简代码,精简到最后只有个wtl界面依然通不过。接下来的测试就略过,反正最后就剩下来下面这几行代码。如果去掉atomic的注释,则无法通过编译。

#include <atlbase.h>
#include <atlapp.h>
//#include <atomic>
CAppModule _tModule;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR szCmdLine, int nCmdShow)
{
    int ret = 0;
    return ret;
}
  ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
  ◆                                                                                                ◆
  ◆                 *         *      * *             *        * * * * *  *                         ◆
  ◆                  *       *     *                 *            *      *                         ◆
  ◆                   *     *     *       * * * * *  *            *      *                         ◆
  ◆                    *   *       *                 *            *      *                         ◆
  ◆                      *           * *             * * * *      *      * * * *                   ◆
  ◆                                                                                                ◆
  ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆

  VC-LTL Path      : C:\Work\CodeSource\VC-LTL\
  VC Tools Version : 14.16.27023
  UCRT Version     : 10.0.17763.0
  Platform         : x64
  Using VC-LTL Vista Advanced Mode
main.cpp
libcpmt.lib(nothrow.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_LTL_StaticRelease”不匹配值“MT_StaticRelease”(main.obj 中)
C:\Users\gbgba\Documents\Visual Studio 2017\Projects\checkwtl\x64\Release\checkwtl.exe : fatal error LNK1319: 检测到 1 个不匹配项
已完成生成项目“checkwtl.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
mingkuang-Chuyu commented 5 years ago

看错误信息 应该是 include出了问题。 因为明显可以看到 main.cpp的头文件 不是VC-LTL的。

mingkuang-Chuyu commented 5 years ago

建议你的检查下include顺序,另外实在不知道的话 不妨加QQ群。

augustheart commented 5 years ago

除了多了那个标准库里面的atomic,如上的代码已经是一个wtl程序最基本的构造了,atl的头文件atlbase.h是一定需要在wtl头文件atlapp.h之前的。include方面应该没有可调的余地了。这段代码基本上已经无法再做任何修改,再改就要改到atl或是wtl里面去了。所以这个情况就比较诡异了。 这个代码在4.0之前也就是那个使用MD模式编译的版本是正常的

mingkuang-Chuyu commented 5 years ago

除了多了那个标准库里面的atomic,如上的代码已经是一个wtl程序最基本的构造了,atl的头文件atlbase.h是一定需要在wtl头文件atlapp.h之前的。include方面应该没有可调的余地了。这段代码基本上已经无法再做任何修改,再改就要改到atl或是wtl里面去了。所以这个情况就比较诡异了。 这个代码在4.0之前也就是那个使用MD模式编译的版本是正常的

我的意思是include变量,不是include<>,实在是是听不懂的话,加QQ群吧,让我看看include应该能解决了。

mingkuang-Chuyu commented 5 years ago

应该就是include变量中目录顺序存在问题,本地 测试 未遇到此问题。

解决方案 不妨参考 4.1. 未共享到msvcrt.dll

另外需要注意,VC-LTL 相关文件顺序必须在微软相关文件之前。

比如说,我的WTL测试工程的,配置。 image

augustheart commented 5 years ago

根据你的提示,最后确实找到了些问题。但是和库目录的优先级问题倒是不大…… 我的VC-LTL的安装目录为: C:\Work\CodeSource\VC-LTL 所以呢,atlbase.h的路径应该是: C:\Work\CodeSource\VC-LTL\\VC\14.16.27023\atlmfc\include\atlbase.h 但是实际上如果我在 #include <atlbase.h> 上右键打开atlbase.h,将会弹出错误: C:\Work\CodeSource\c-ltl\c\4.16.27023\tlmfc\nclude\se.h 无法打开文件 这下问题有点明朗了。我做了进一步的测试,将VC-LTL目录移到根目录C,重新设置项目和ltl的路径,现在VC-LTL的目录是 C:\VC-LTL 接下来所有的一切都正常了,无论打开头文件还是编译都正常了。看起来似乎是路径长度问题?不过我看你的截图里面的路径应该比我的长才对。为了进一步检查原因,我把VC-LTL移动回原路径,再重新设置项目属性和ltl路径。右键打开atlbase.h,错误依旧。然后我添加 #include <afx.h>,现在代码为: `#include

include

include

include `

右键打开afx.h,神奇般地打开了。这个时候是否是可以判断是路径长度有关?错!接下来更诡异的现象出现了,我再加了一个include ,也就是: `#include

include

include

include

include `

然后……两行afx.h都没法右键打开了…… 至此我已经有点抓狂了,删掉一行afx.h,依然无法右键打开。然后我关闭项目,再打开,删除afx的include,然后再添加,右键打开成功。接下来我右键打开atlbase.h,一如既往地不成功,然后我再右键打开afx.h,出现了!!薛定谔的afx.h出现了,它居然再也打不开了…… 上面的测试用不同的步骤重复了多遍,总之只要出现过一次无法打开头文件的情况,半秒钟之前还能打开的afx.h马上便再也无法用任何方法打开了。反正它对我的人生观世界观价值观产生了极大的冲击……至此我已经无法也没能力判断到底是windows系统问题了还是vs出问题了还是ltl出问题了又或是我穿越到了一个物理特性完全不同的平行空间……按说ltl出问题的概率比较小,不过同样路径很长的wtl文件 C:\Users\gbgba\Documents\Visual Studio 2017\commonlib\WTL10\Include\atlapp.h 始终正常打开。(和wtl版本无关,wtl9也是一样的情况) 好了,问题就是这样了,我先去想念一下静静,或许静静能告诉我问题出在哪……

附我的环境: windows 10 家庭版 1806 visaul studio 2017 15.9.11

mingkuang-Chuyu commented 5 years ago

我建议还是加QQ群吧……如果今天你不加,那么我需要半个月后才能再处理这个问题。

augustheart commented 5 years ago

先关掉吧,我调高了msbuild日志等级也没有加载失败的错误日志。基本上没办法确定到底是哪儿影响的。我后来修改了一下文件发现应该是由于未知原因 <Import Project="$(VC_LTL_Root)\Config\config.props" Condition="Exists('$(VC_LTL_Root)\Config\config.props')"/> (确定过,VC_LTL_Root变量无误,相关文件也是存在的) 这一行不生效,执行到了下一行 <!--兼容模式,尝试加载老版本--> <Import Project="$(VC_LTL_Root)\ltlvcrt.props" Condition="(!Exists('$(VC_LTL_Root)\Config\config.props')) And (Exists('$(VC_LTL_Root)\ltlvcrt.props'))"/> 然后又由于未知原因,导致了循环加载。(我没有仔细了解过属性表的工作原理,所以可能理解有误) 最后,前天晚上我实在受不了了,终于用格式化重装解决了这个问题。然后昨晚把常用软件也逐渐装回去,问题也没有再发生。之前那个系统用了两年,各种补丁升级,不同版本的vs编译器安装删除(从08到19都反复安装卸载过),大概是在这过程中影响到了什么? 这件事也确定了,win10自带的重置功能并不能做到让系统完全重置,应该还是会把某些问题设置保存下来。

mingkuang-Chuyu commented 5 years ago

其实应该让我远程看看😰