gpt4 book ai didi

visual-c++ - 从 VC8 (VS2005) 到 VC9 (VS2008) 的移植问题是什么?

转载 作者:行者123 更新时间:2023-12-04 06:37:13 25 4
gpt4 key购买 nike

我继承了一个在VC8(VS2005)下构建和测试的非常庞大和复杂的项目(实际上是一个由119个'项目'组成的'解决方案',其中大部分是DLL),我的任务是移植它到 VC9 (VS2008)。

我使用的移植过程是:

  1. 复制VC8.sln文件并重命名到 VC9 .sln 文件。
  2. 复制所有VC8工程文件,并重命名他们到 VC9 项目文件。
  3. 编辑所有的 VC9 项目文件,s/vc8/vc9.
  4. 编辑 VC9.sln,s/vc8/vc9/
  5. 加载 VC9 .slnVS2008,让IDE“转换”所有项目文件。
  6. 修复编译器和链接器错误,直到我身材不错。

到目前为止,我在最后一步遇到了以下问题。

1) 修饰名称的计算方式发生变化,导致名称被截断。

这不仅仅是一个警告 (http://msdn.microsoft.com/en-us/library/074af4b6.aspx)。使用此警告构建的库将不会与其他模块链接。应用 MSDN 中给出的解决方案并非易事,但可行。我在 How do I increase the allowed decorated name length in VC9 (MSVC 2008)? 中单独解决了这个问题

2) 不允许将零分配给迭代器的更改。这是符合规范的,并且很容易找到并修复这些以前允许的编码错误。不要将零分配给迭代器,而是使用值 end()。

3) for 循环范围现在符合 ANSI 标准。另一个易于解决的问题。

4) 预编译头文件需要更多空间。在某些情况下,需要更多的空间。我最终使用/Zm999 来提供最大的 PCH 空间。如果 PCH 内存使用量再次增加,我认为我将不得不完全放弃 PCH,并忍受已经很长的构建时间的增加。

5) 对复制构造函数和默认构造函数的要求发生了变化。似乎在模板类中,在我还没有完全弄清楚的某些条件下,编译器不再生成默认的 ctor 或默认的 dtor。我怀疑这是 VC9 中的错误,但可能还有其他地方我做错了。如果是这样,我当然想知道它是什么。

6) sln 和 vcproj 文件中的 GUID 未更改。这似乎不会以我能检测到的任何方式影响构建,但它仍然令人担忧。

请注意,尽管存在所有这些问题,该项目还是在 VC8 下构建、运行并通过了广泛的 QA 测试。我还向后移植了 VC8 项目的所有更改,它们仍然像以前一样愉快地构建和运行(使用 VS2005/VC8)。因此,尽管回归测试仍在进行中,但我对 VC9 构建所需的所有更改至少看起来是向后兼容的。

现在是真正困难的问题:我遇到了 VC8 和 VC9 项目之间启动顺序的差异。在 Andrei Alexandrescu 的《现代 C++ 设计》一书中,该程序使用了一个以 Loki 为模型的小对象分配器。该分配器使用主程序模块中定义的全局变量进行初始化。

在 VC8 下,这个全局变量是在程序启动的最开始时从模块 crtexe.c 中的代码构造的。在VC9下,最先执行的模块是crtdll.c,说明启动顺序变了。正在启动的 DLL 似乎通过在全局对象可以初始化统计信息之前分配和释放内存来混淆小对象分配器,从而导致一些虚假的诊断。该程序的运行似乎没有受到实质性影响,但 QA 人员不会允许虚假诊断通过他们。

有没有办法在加载 DLL 之前强制构建全局对象?

我可能会遇到哪些其他移植问题?

最佳答案

Is there some way to force the construction of a global object prior to loading DLLs?

DELAYLOAD 选项怎么样?这样 DLL 在第一次调用之前不会加载?

关于visual-c++ - 从 VC8 (VS2005) 到 VC9 (VS2008) 的移植问题是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/254057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com