问题标签 [visual-c++-2008]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - VC9 和 VC8 库兼容性
(最初的问题是在那里提出的:http ://www.ogre3d.org/phpBB2/viewtopic.php?t=44832 )
有人问:“虽然我想在 vs2008 (VC9) 中构建所有内容,但 PhysX SDK 是使用 vs2005 (VC8) 构建的。使用所有 vc9 编译的库并与此 vc8 库结合使用会导致任何问题吗?”
我回答说,在我尝试使用 VC8 生成的 .lib 文件(和 .dll)并将其包含在 vc9 编译的 exe 中的前一天,编译器无法打开 .lib 文件。
现在,其他人回答说他们这样做没有问题......
我找不到有关 vc9 和 vc8 之间的 lib 兼容性的信息。
所以……救命?
visual-studio-2008 - 如何增加 VC9 (MSVC 2008) 中允许的修饰名称长度?
我有一组相当庞大和复杂的程序可以从 VC8 移植到 VC9。其中一个模块有许多分层的 typedef,这会导致编译器生成 C4503 警告(装饰名称被截断)。生成的 LIB 文件将无法正确链接到项目中的其他模块。VC8 对此没有任何问题,这使我得出结论,要么修饰过程已更改为生成更长的名称,要么已减少修饰名称长度的内部限制。克服这个问题的最好方法是什么?
由于遗留代码的原因,MSDN 建议用结构替换 typedefs 是不切实际的。
有问题的 typedef 是(经过清理的代码):
c++ - ActiveX 插件导致 ASSERT 在 VS2008 中的应用程序退出时失败
我使用“ESRI MapObjects LT2”ActiveX 插件的 MFC 应用程序在关闭它时会向我抛出一个 ASSERT。错误发生在cmdtarg.cpp
:
我用 VC9 构建了(本机 C++)应用程序。当我用 VC6 编译应用程序时,它表现得很好。
这可能是什么原因?
visual-c++ - 从 VC8 (VS2005) 到 VC9 (VS2008) 的移植问题是什么?
我继承了一个在 VC8(VS2005)下构建和测试的非常庞大而复杂的项目(实际上是一个由 119 个“项目”组成的“解决方案”,其中大部分是 DLL),我的任务是将它移植到 VC9 (VS2008)。
我使用的移植过程是:
- 复制 VC8 .sln 文件并将其重命名为 VC9 .sln 文件。
- 复制所有 VC8 项目文件,并将它们重命名为 VC9 项目文件。
- 编辑所有 VC9 项目文件,s/vc8/vc9。
- 编辑 VC9 .sln, s/vc8/vc9/
- 使用 VS2008 加载 VC9 .sln,并让 IDE“转换”所有项目文件。
- 修复编译器和链接器错误,直到我得到一个好的构建。
到目前为止,我在最后一步中遇到了以下问题。
1) 修饰名称的计算方式发生变化,导致名称被截断。
这不仅仅是一个警告 ( http://msdn.microsoft.com/en-us/library/074af4b6.aspx )。使用此警告构建的库不会与其他模块链接。应用 MSDN 中给出的解决方案并非易事,而是可行的。我在如何增加 VC9 (MSVC 2008) 中允许的修饰名称长度?
2) 不允许将零分配给迭代器的更改。这是符合规范的,很容易找到并修复这些以前允许的编码错误。不要将零分配给迭代器,而是使用值 end()。
3) for-loop 范围现在符合 ANSI 标准。另一个容易解决的问题。
4) 预编译头文件需要更多空间。在某些情况下,需要更多的空间。我最终使用 /Zm999 来提供最大的 PCH 空间。如果 PCH 内存使用量再次增加,我认为我将不得不完全放弃 PCH,并忍受已经很长的构建时间的增加。
5) 对复制 ctor 和默认 dtor 的要求有所改变。似乎在模板类中,在我还没有完全弄清楚的某些条件下,编译器不再生成默认 ctor 或默认 dtor。我怀疑这是 VC9 中的一个错误,但可能还有其他我做错的事情。如果是这样,我肯定想知道它是什么。
6) sln 和 vcproj 文件中的 GUID 没有改变。这似乎不会以我可以检测到的任何方式影响构建,但仍然令人担忧。
请注意,尽管存在所有这些问题,该项目还是在 VC8 下构建、运行并通过了广泛的 QA 测试。我还将所有更改移植到 VC8 项目中,它们仍然像以前一样愉快地构建和运行(使用 VS2005/VC8)。因此,我为 VC9 构建所需的所有更改至少看起来是向后兼容的,尽管回归测试仍在进行中。
现在解决真正困难的问题:我遇到了 VC8 和 VC9 项目的启动顺序不同。该程序使用了一个仿照 Loki 的小对象分配器,在 Andrei Alexandrescu 的 Book Modern C++ Design中。该分配器使用主程序模块中定义的全局变量进行初始化。
在 VC8 下,这个全局变量是在程序启动的最开始时从模块 crtexe.c 中的代码构造的。在VC9下,第一个执行的模块是crtdll.c,表示启动顺序发生了变化。正在启动的 DLL 似乎通过在全局对象初始化统计信息之前分配和取消分配内存来混淆小对象分配器,这会导致一些虚假的诊断。该程序的运行似乎没有受到实质性影响,但 QA 人员不会允许虚假诊断通过他们。
有没有办法在加载 DLL 之前强制构建全局对象?
我可能会遇到哪些其他移植问题?
c++ - 使用具有不同编译器版本的 C++ DLL
这个问题与“如何在 VS 版本之间制作一致的 dll 二进制文件?”有关。
- 我们有使用 VC6 构建的应用程序和 DLL 以及使用 VC9 构建的新应用程序。VC9 应用程序必须使用用 VC6 编译的 DLL,其中大部分是用 C 编写的,一个是用 C++ 编写的。
- 由于名称修饰/修改问题,C++ 库存在问题。
- 使用 VC9 编译所有内容目前不是一种选择,因为似乎有一些副作用。解决这些问题将非常耗时。
- 我可以修改 C++ 库,但它必须使用 VC6 编译。
- C++ 库本质上是另一个 C 库的 OO 包装器。VC9-app 使用一些静态函数以及一些非静态函数。
虽然静态函数可以用类似的东西来处理
使用非静态方法并不容易。
据我了解,Chris Becke关于使用类 COM 接口的建议对我没有帮助,因为接口成员名称仍将被修饰,因此无法从使用不同编译器创建的二进制文件中访问。我在吗?
唯一的解决方案是使用对象的处理程序编写 C 风格的 DLL 接口,还是我遗漏了什么?在那种情况下,我想,直接使用封装的 C 库可能会更省力。
c++ - 如何在 VC++ 中使用资源?
我正在使用 VC 9,我想为我的应用程序支持俄语。我什至创建了俄语资源字符串。但我的系统有俄语设置。如果不存在,则每个字符都显示垃圾(其代码页为 1251)。我还从俄罗斯资源文件中制作了 DLL。如果我从安装位置在应用程序中运行该 DLL,它工作正常。但是当我将计算机设置更改为英语并从应用程序运行该 DLL 时,对话框和消息框显示垃圾字符。但是应用程序不应该从 DLL 中读取,而不是从计算机语言设置中读取吗?在这里,我面临如何制作独立于语言的 DLL 的问题。有任何代码或设置吗?
string - 使用 basic_string 时出现错误 c2664vc++ 9.0 中的 abc("hello")
嗨,在 Visual Studio 2008 中编译此代码时,我收到以下错误
错误 C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it)' : 无法将参数 1 从 'const char [12]' 转换为' std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'
错误 C2679:二进制“<<”:未找到采用“std::basic_string<_Elem,_Traits,_Ax>”类型的右侧操作数的运算符(或没有可接受的转换)
我做错了什么?
谁能帮我理解背后发生的事情?谢谢
c++ - 在 C++ 中查看编译器错位名称
如何查看 C++ 中重载函数的编译器生成的重载名称?我正在使用 VC9,但也欢迎其他编译器的答案。
编辑:我在这里找到所有有用的答案。接受我最喜欢的那个。
c++ - VC2008中的返回值优化
是否有其他技术可以与 VC2008 一起使用,例如 RVO(返回值优化)或 NRVO(命名返回值优化)?
c++ - “无法转换参数”使用 boost::variant 迭代器
我想创建一个函数,它可以采用不同类型的迭代器来存储相同类型的对象:
第一个是std::map
包含shared_ptr<Foo>
(typedef-ed as FooMap
),另一个是std::list
也包含shared_ptr<Foo>
(FooList
)。
我真的很喜欢MSalters 为类似问题建议的解决方案,并尝试实现boost::variant
迭代器,该函数将获取迭代器作为从第一个迭代到第二个的参数。
我的函数看起来像这样(简化了很多):
FooIterator 和访问者定义如下:
我从这封邮件的附件中得到了上述大部分内容。根据 MSalters 的回答,该解决方案还使用了适配器和策略,这似乎有点太多了,所以我不想简单地复制该代码。特别是因为我只了解其中的一部分。
使用上面的代码,我从 VS2008 得到以下编译器错误(这只是总共 160 行的前几行,我认为在这里发布有点太多了;但是我很乐意添加它们如果有人想要全部查看):
我究竟做错了什么?