我编写了一些代码,利用开源库来完成一些繁重的工作。这项工作是在 linux 中完成的,使用单元测试和 cmake 来帮助将其移植到 Windows。需要让它在两个平台上运行。
我喜欢 Linux,我喜欢 cmake,我喜欢我可以自动生成 Visual Studios 文件。就像现在一样,在 Windows 上,一切都将编译,它将链接并生成测试可执行文件。
然而,为了达到这一点,我不得不与 windows 斗争了几天,学习所有关于清单文件和可再发行包的知识。
据我的理解:
在 VS 2005 中,Microsoft 创建了 Side By Side dll。这样做的动机是,以前,多个应用程序会安装同一个 dll 的不同版本,导致以前安装和工作的应用程序崩溃(即“Dll Hell”)。并排 dll 解决了这个问题,因为现在每个可执行文件/dll 都附加了一个“清单文件”,用于指定应该执行哪个版本。
这一切都很好。应用程序不应再神秘地崩溃。然而...
Microsoft 似乎在每次发布 Visual Studios 时都会发布一组新的系统 dll。另外,正如我之前提到的,我是一名试图链接到第三方库的开发人员。通常,这些东西作为“预编译的 dll”分发。现在,当使用一个版本的 Visual Studio 编译的预编译 dll 链接到使用另一个版本的 Visual Studio 的应用程序时会发生什么?
根据我在互联网上阅读的内容,发生了不好的事情。幸运的是,我从来没有走到那一步——在运行可执行文件时,我一直遇到“MSVCR80.dll not found”问题,因此我开始涉足整个清单问题。
我最终得出的结论是,让它工作的唯一方法(除了静态链接一切)是所有第三方库必须使用相同版本的 Visual Studios 编译 - 即不要使用预编译的 dll - 下载源代码,构建一个新的 dll 并改用它。
这是真的吗?我错过了什么?
此外,如果情况似乎如此,那么我不禁认为微软出于邪恶的原因故意这样做。
它不仅会破坏所有预编译的二进制文件,从而使使用预编译的二进制文件变得不必要地困难,如果您碰巧在一家使用第三方专有库的软件公司工作,那么每当他们升级到最新版本的视觉工作室时 - 您的公司必须现在做同样的事情,否则代码将不再运行。
顺便说一句,linux如何避免这种情况?虽然我说我更喜欢在它上面进行开发并且我了解链接的机制,但我没有维护任何应用程序足够长的时间来遇到这种低级共享库版本控制问题。
最后,总结一下:这种新的清单方案是否可以使用预编译的二进制文件?如果是,我的错误是什么?如果不是,微软真的认为这会使应用程序开发更容易吗?
更新 - 一个更简洁的问题:Linux 如何避免使用 Manifest 文件?