我正在使用CUDA(VC++,Visual studio 2008sp1)来调试FEM程序.由于cuda的不足,该程序只能在Win32平台上运行.我认为链接的库文件都是在x86平台上编译的,但是当我编译它时,我收到错误消息"致命错误LNK1112:模块机器类型'x64'与目标机器类型'X86'冲突".
我试图将平台转换为x64,但它没有用.请告诉我:什么是"模块机器类型"什么是"目标机器类型"?我怎么能克服它?
我的代码中有这个问题:
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++中使用枚举作为模板(类型)参数有任何限制/问题吗?
例:
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编写的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次,而这只是我的技能(或者我的耐心).
我认为必须有一些方法来获得"第一次机会"的例外,实际上给我一个"机会"来处理它.可能有一些"在第一次机会异常时立即中断"配置设置我不知道,但它似乎并不是所有可发现的.
有谁知道它在哪里以及如何启用它?
我们正在将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)
主应用程序有两种部署方案:
我们正在做以下事来解决这个问题:
使用宏_BIND_TO_CURRENT_OPENMP_VERSION(对于MainApp中的所有项目)编译MainApp目标.
将VS2008SP1可再发行DLL分发为专用程序集,并将它们复制到应用程序安装目录中.
问题:
谢谢.
c++ redistributable visual-studio-2008-sp1 visual-c++-2008 visual-c++
我试图在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) STL容器要求存储的值可以复制构造和分配.const T显然不是任何T的可分配类型,但我试图使用它(只是好奇)并发现它编译,而且,表现为可分配类型.
vector<const int> v(1);
v[0] = 17;
Run Code Online (Sandbox Code Playgroud)
这在Visual Studio 2008中成功运行,并将v [0]分配给17.
我有以下"第一次机会异常"消息,它来自我写的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++ …
对于静态Win32库,如何检测是否设置了任何"使用MFC"选项?
即
#ifdef ---BuildingForMFC---
....
#else
...
#endif
Run Code Online (Sandbox Code Playgroud) 这是我的文件夹结构:
/
|
-- 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在输出文件夹中编译成相同的文件.结果,一个人覆盖另一个人.
c++ linker-errors visual-studio-2008 visual-c++-2008 visual-c++