标签: visual-c++-2008

致命错误LNK1112:模块机器类型'x64'与目标机器类型'X86'冲突

我正在使用CUDA(VC++,Visual studio 2008sp1)来调试FEM程序.由于cuda的不足,该程序只能在Win32平台上运行.我认为链接的库文件都是在x86平台上编译的,但是当我编译它时,我收到错误消息"致命错误LNK1112:模块机器类型'x64'与目标机器类型'X86'冲突".

我试图将平台转换为x64,但它没有用.请告诉我:什么是"模块机器类型"什么是"目标机器类型"?我怎么能克服它?

visual-c++-2008 visual-c++

171
推荐指数
7
解决办法
30万
查看次数

警告C4800:'int':强制值为bool'true'或'false'(性能警告)

我的代码中有这个问题:

bool CBase::isNumber()
{
return (id & MID_NUMBER);
}

bool CBase::isVar()
{
return (id & MID_VARIABLE);
}

bool CBase::isSymbol()
{
return (id & MID_SYMBOL);
}
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++-2008 visual-c++-2010

30
推荐指数
2
解决办法
3万
查看次数

在C++中使用enum作为模板类型参数

在C++中使用枚举作为模板(类型)参数有任何限制/问题吗?

例:

enum MyEnum
{
    A, B, C, D, E
};

template <typename _t>
class MyTemplate
{
public:
   _t value;

   void func(const _t& param) { /* .... */ }
};

// ....

MyTemplate<MyEnum> MyInstance;
Run Code Online (Sandbox Code Playgroud)

我在Win32/x86上通过VS 2008(SP1)使用MSVC++的实际问题是与使用枚举作为模板参数的类相关联的几个编译错误(=编译器报告的错误).遗憾的是,我的项目变得有点复杂(您可以将其视为设计错误:P),引发,嵌套甚至专门针对具有枚举模板参数的类的模板类会引发这些错误.

尝试构建时,编译器会在只有注释的行中报告许多错误/无用的错误,例如"C2059:语法错误:'public'".其中许多我可以通过替换类似于示例中的方法来修复const _t¶m by _t(即复制参数),但我也无法解决所有这些错误,也不知道为什么这个"帮助" .**我知道,上面的简单例子编译没有错误.

使用int而不是enum,我的项目编译没有错误.

提前感谢任何提示或提示!


编辑:

毕竟,我认真考虑这是一个编译器错误.当我尝试使用简化代码重现错误时,我只在50%的所有"构建"中获得它们,而不是非常确定性:
例如,尝试编译,并报告了这些错误.重建 - 没有变化.删除评论,构建 - 没有变化.重建 - 然后:没有错误,编译好.

我已经遇到了一些编译器错误(我估计在20k行代码中有2或3个),但这个在我看来非常奇怪.
任何建议如何弄清楚它是否是编译器?

c++ enums templates visual-c++-2008

16
推荐指数
2
解决办法
3万
查看次数

如何在异常中使VC++的调试器中断?

我正在尝试调试用C编写的DLL中的问题,该问题一直导致访问冲突.我正在使用Visual C++ 2008,但代码是直的C.

我已经习惯了Delphi,如果在调试器下运行时发生异常,程序将立即进入调试器,它将为您提供检查程序状态的机会.但是,在Visual C++中,我得到的只是Output选项卡中的一条消息:

First-chance exception at blah blah blah: Access violation reading location 0x04410000. 没有休息,没有.它只是进入并展开堆栈,直到它回到我的Delphi EXE中,它识别出错误并在那里提醒我,但到那时我已经失去了几层调用堆栈,我不知道发生了什么.

我已经尝试了其他的调试技术,但无论它在做什么,都是在C宏中的嵌套循环中深入调用,这个循环被调用超过500次,而这只是我的技能(或者我的耐心).

我认为必须有一些方法来获得"第一次机会"的例外,实际上给我一个"机会"来处理它.可能有一些"在第一次机会异常时立即中断"配置设置我不知道,但它似乎并不是所有可发现的.

有谁知道它在哪里以及如何启用它?

c debugging exception visual-c++-2008 visual-c++

13
推荐指数
1
解决办法
4602
查看次数

是否有使用宏_BIND_TO_CURRENT_VCLIBS_VERSION的副作用?

我们正在将VC++项目从Visual Studio 2003移植到Visual Studio 2008 SP1(9.0.30729.4148).依赖的外部库也使用Visual Studio 2008 SP1进行编译.

MainApp - Main application Compiled with VS SP1 9.0.30729.4148
ExtStaticLib1 - External static library compiled with VS  SP1 9.0.30729.4148
ExtDynamicDll1 - External DLL compiled with VS  SP1 9.0.30729.4148
Run Code Online (Sandbox Code Playgroud)

主应用程序有两种部署方案:

  • 具有用户管理员权限的计算机:我们建议在使用应用程序MainApp之前先安装Visual Studio可再发行组件包.这很有效,因为用户具有管理员权限,并且安装可再发行组件包没有问题.应用程序自动链接到WinSxS文件夹中的VC redist DLL.
  • 具有非管理员用户的计算机:此方案存在问题.用户没有管理员权限.因此,无法安装VS2008SP1 redistrtibutable包.

我们正在做以下事来解决这个问题:

  • 使用宏_BIND_TO_CURRENT_OPENMP_VERSION(对于MainApp中的所有项目)编译MainApp目标.

  • 将VS2008SP1可再发行DLL分发为专用程序集,并将它们复制到应用程序安装目录中.

问题:

  1. 使用标志_BIND_TO_CURRENT_VCLIBS_VERSION是否有任何副作用(特别是当VC可再发行程序包和私有VC redist程序集一起存在时)?
  2. 我们对外部库ExtStaticLib1,ExtDynamicDll1没有太多控制权,因此它们不会使用宏_BIND_TO_CURRENT_OPENMP_VERSION进行编译.但它们已经使用VSSp1编译.这个设置会有任何问题吗?
  3. 如果有更新版本的VS可再发行组件(比9.0.30729.4248更新),是否会出现任何问题.

谢谢.

c++ redistributable visual-studio-2008-sp1 visual-c++-2008 visual-c++

13
推荐指数
1
解决办法
1428
查看次数

如何递归取消引用指针(C++ 03)?

我试图在C++中递归取消引用指针.

如果传递的对象不是指针(这包括智能指针),我只想在可能的情况下通过引用返回对象本身.

我有这个代码:

template<typename T> static T &dereference(T &v) { return v; }
template<typename T> static const T &dereference(const T &v) { return v; }
template<typename T> static T &dereference(T *v) { return dereference(*v); }
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,我的代码似乎工作正常,但是在给定函数指针时会中断,因为取消引用函数指针会导致相同类型的函数指针,从而导致堆栈溢出.

那么,当解除引用类型与原始对象具有相同类型时,如何"停止"解除引用过程?

注意:

我看到我的问题被标记为使用Boost的类似问题的副本; 但是,我需要一个没有Boost(或任何其他库)的解决方案.


例:

template<typename T> T &dereference(T &v) { return v; }
template<typename T> const T &dereference(const T &v) { return v; }
template<typename T> T &dereference(T *v) { return dereference(*v); }

template<typename TCallback …
Run Code Online (Sandbox Code Playgroud)

c++ templates pointers function-pointers visual-c++-2008

13
推荐指数
1
解决办法
563
查看次数

VC++允许对STL容器使用const类型.为什么?

STL容器要求存储的值可以复制构造和分配.const T显然不是任何T的可分配类型,但我试图使用它(只是好奇)并发现它编译,而且,表现为可分配类型.

vector<const int> v(1);
v[0] = 17;
Run Code Online (Sandbox Code Playgroud)

这在Visual Studio 2008中成功运行,并将v [0]分配给17.

c++ stl const visual-c++-2008 visual-c++

12
推荐指数
2
解决办法
614
查看次数

如何调试或修复涉及boost :: interprocess managed_shared_memory的无限循环和堆损坏问题?

我有以下"第一次机会异常"消息,它来自我写的DLL,它运行在我没写的可执行文件中.也就是说,DLL是一个插件.第一次触发此异常时,尝试打开共享内存映射文件失败.如果我忽略了第一次机会异常并且只是运行,应用程序最终会冻结或崩溃.

First-chance exception at 0x76a7c41f in notmyexe.exe: Microsoft C++ exception: boost::interprocess::interprocess_exception at memory location 0x002bc644..
Run Code Online (Sandbox Code Playgroud)

几个小时之后,它似乎是由一个代码块引起的,这个代码块无休止地循环,直到预期的异常条件清除为止.事实证明,如果它永远不会清除,那么,最终,这个异常会变成另一个低级异常条件和/或变成堆损坏.所有这些只是为了使用Boost :: interprocess打开共享内存区域.

使事情变得复杂的第一件事是,在我的基于Visual C++ 2008的项目中,第boost::interprocess::interprocess_exception一次机会异常没有被抛出并被识别为它来自的位置,因为Visual C++ 2008编译器无法找到复杂的boost-flavor模板代码.题.但是,通过单步执行汇编语言视图,我发现代码爆炸了.

我自己的代码的顶级行开始变坏了:

  segment = new managed_shared_memory(   open_or_create
                                      ,  MEMORY_AREA_NAME
                                      , SHARED_AREA_SIZE );          
Run Code Online (Sandbox Code Playgroud)

上面的managed_shared_memory类来自interprocess_fwd.hpp,是boost共享内存API /头文件的标准部分.因为它是基于模板的,所以上面扩展到大约2Kchars长的C++ boost模板表达式,它由链接器和调试器截断不同的长度.Visual C++ 2008没有更多源代码调试功能,似乎在这些限制发挥作用时.

例如,当它爆炸时,我得到这个调用堆栈:

    KernelBase.dll!76a7c41f()   
    [Frames below may be incorrect and/or missing, no symbols loaded for KernelBase.dll]    
    KernelBase.dll!76a7c41f()   
>   msvcr90d.dll!_malloc_dbg(unsigned int nSize=2290875461, int nBlockUse=264, const char * szFileName=0x01fcb983, int nLine=1962999808)  Line 160 + 0x1b bytes C++
    8bfc4d89()  
Run Code Online (Sandbox Code Playgroud)

上面的堆栈转储中没有实际的最终用户编写的源函数.

我该怎么调试呢?其次,使用Visual C++ …

c++ boost boost-interprocess visual-c++-2008

9
推荐指数
1
解决办法
2038
查看次数

如何在预处理器中检测"使用MFC"

对于静态Win32库,如何检测是否设置了任何"使用MFC"选项?

#ifdef ---BuildingForMFC---
....
#else
...
#endif
Run Code Online (Sandbox Code Playgroud)

c++ mfc visual-c++-2008

8
推荐指数
2
解决办法
3553
查看次数

VS2008:我可以在不同的文件夹中构建一个包含2个同名CPP文件的项目吗?

这是我的文件夹结构:

/
|
 -- program.cpp
 -- utility.h
 -- utility.cpp
|
 -- module/
    |
     -- utility.h
     -- utility.cpp

// Note that I have two files named utility.h and two named utility.cpp
Run Code Online (Sandbox Code Playgroud)

在构建项目时,我收到一个链接错误(LNK2028:未解析的令牌等等......),说明某些符号未定义.我已经确认所有符号都已定义,并且所有声明的函数都有相应的定义.

我有一种感觉,在编译我的项目时,utility.cpp两个文件夹中的文件都会utility.obj在输出文件夹中编译成相同的文件.结果,一个人覆盖另一个人.

  1. 这是预期的行为吗?
  2. 如何构建一个C++二进制文件,其中包含两个具有相同名称的文件(尽管在不同的文件夹中)?

c++ linker-errors visual-studio-2008 visual-c++-2008 visual-c++

8
推荐指数
1
解决办法
4369
查看次数