ObjectARX 常见编译错误解决方式记录
C1189 Winver 0x501 fatal error C1189: #error: MFC does not support WINVER less than 0x0501.
方式一&方式二
注释掉后,vs会自动从WinSDKVer.h头文件获取
_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
C1189 RTCc fatal error C1189: #error: /RTCc rejects conformant code
方式一
增加预处理定义 _ALLOW_RTCc_IN_STL
方式二
define _ALLOW_RTCc_IN_STL
方式三
修改代码生成中的较小类型检查/RTCc 为否
C2220 警告被视为错误 error C2220: 警告被视为错误 - 没有生成“object”文件
方式一
修改警告的错误,保证不出现这个警告 ,例如这个int类型改为UINT类型
方式二
修改属性页,修改c/c++->常规->警告视为错误 改为否
方式三
禁用出现的这个警告编号 (disable:4838),这样就不会出现警告提示
LNK2001 无法解析的外部符号"void *_cdecl acHeapAlloc(void *,unsigned _int64)" (?acHeapAlloc@@YAPEAXPEAX_K@Z)
解答 by gz_xl 缺少库
#if _MSC_VER >= 1920 // ObjectARXSDK 2021以上
#pragma comment(lib, "AcPal.lib")
#pragma comment(lib, "acgeoment.lib")
#endif
error LNK2019: 无法解析的外部符号 public: static enum Acad::ErrorStatus __cdecl AcDbRegion::createFromCurves...
解答 by gz_xl ARX2021以及以上版本创建面域缺少库
#if _MSC_VER >= 1920 // ObjectARXSDK 2021以上
#pragma comment(lib, "acgeoment.lib")
#endif
error LNK2019: 无法解析的外部符号 "long __cdecl acdbSetDbmod(class AcDbDatabase *,int)"
解答 by gz_xl 2017开始版本long变更int
//兼容性写法,高低版本都可以
extern Adesk::Int32 acdbSetDbmod(AcDbDatabase* pDb, Adesk::Int32 newVal);
LNK111 模块计算机类型"x64"与目标计算机类型“X86"冲突 或 模块计算机类型"X86"与目标计算机类型“x64"冲突
解答
“模块计算机类型”一般指的是调用已经编译好的lib库文件的是x64,
而 “目标计算机类型“X86” 是指的当前编译设置的编译平台是win32(x86),
当引用的lib文件和当前平台不匹配的时候,就会提示这个问题。
设置好正确的lib即可。在arx中一般是库目录的问题,确保库目录正确。
error C2664: “int acedSSLength(const int64_t [],Adesk::Int32 *)”: 无法将参数 2 从“long *”转换为“Adesk::Int32 *”
解答
//在高版本中获取选择集的数量参数类型从 long 变更为 Adesk::Int32,修改变量类型或者强制转换
Adesk::Int32 len;
acedSSLength(ss,&len);
或者是
long len;
acedSSLength(ss,(Adesk::Int32*)&len);