当前位置:   article > 正文

CAD开发中遇到的问题_using the /rtc option without specifying a debug r

using the /rtc option without specifying a debug runtime will lead to linker

此处记录本人在做CAD项目中遇到的问题,并不适合所有人,只是为了重新遇到问题快速回顾,其他人仅供参考。

环境与开发库

ObjectArx 

CGAL-3.7 

boost_1_61_0 

Xtreme ToolkitPro v15 

ArcGIS10.2

 

问题1 CGAL环境,fatal error C1189: #error :  "Incompatible build options"

#if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG)
#  pragma message("Using the /RTC option without specifying a debug runtime will lead to linker errors")
#  pragma message("Hint: go to the code generation options and switch to one of the debugging runtimes")
#  error "Incompatible build options"
#endif

在 Visual Studio 开发环境中设置此编译器选项

打开项目的“属性页”对话框。 

单击“C/C++”文件夹。

单击“代码生成”属性页。

修改下列属性之一或两者都修改:“基本运行时检查”或“较小类型检查”

 

问题2 重新编译 opennurbs.lib 的时候还要引用这个 Rpcrt4.lib

 

问题3 32位迁移64位 兼容性问题

报错信息:

error C2440: “static_cast”: 无法从“void (__cdecl CGridCtrl::* )(UINT)”转换为“void (__cdecl CWnd::* )(UINT_PTR)”

error C2664: “SetTimer”: 不能将参数 4 从“void (__cdecl *)(HWND,UINT,UINT,DWORD)”转换为“TIMERPROC”

解决:

#ifdef _WIN64
void CALLBACK OnTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
#else
void CALLBACK OnTimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
#endif

#ifdef _WIN64
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg LRESULT OnChangePrjProp(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnChangeSelectEnt(WPARAM wParam, LPARAM lParam);
    LRESULT OnParentClose(WPARAM wParam, LPARAM lParam);
#else
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg long OnChangePrjProp(WPARAM wParam, LPARAM lParam);
    afx_msg long OnChangeSelectEnt(WPARAM wParam, LPARAM lParam);
    long OnParentClose(WPARAM wParam, LPARAM lParam);
#endif

问题4 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

问题5 LINK : fatal error LNK1104: 无法打开文件“CGAL-vc100-mt-gd.lib”

使用源码重新生成lib文件,或者把现有的CGAL-vc100-mt.lib直接改名试试

问题6 Error LNK2001 无法解析的外部符号

1 查找外部符号头文件是否已经#include

2 找出所属lib看看是否已经被导入

3 查看lib源码看看方法是否已经导出

4 查看外部符号是否在本项目内,已经被包含进工程里面

 

问题7 精度问题

 

闭合多段线与射线使用intersectWith 会取出来两个交点,发生的问题是CAD精度导致,有两个解决方法:

1 是取出交点后,重新用getClosestPointTo判断交点是否在实体上。

2 把实体移动到原地附近再做处理

 

问题7 编译错误

错误描述: acax17enu.tlh(613) : error C2371: 'LONG_PTR' : redefinition; different basic types see declaration of 'LONG_PTR'

解决:

#import "acax17enu.tlb" raw_interfaces_only no_namespace // VS2005 - VC8、CAD2007

改为
#import "acax18enu.tlb" raw_interfaces_only no_namespace // VS2005 - VC8、CAD2007

 

问题8 ADO调用

在CAD使用ADO的方式输出Excel,会存在版本不匹配的问题。例如:CAD 2008中调用Office 2010 x64,会在Open函数中直接跳出异常。可以考虑使用COM的方式,未实测。

_ConnectionPtr exclConn;
CString connStr;

exclConn.CreateInstance(__uuidof(Connection));

connStr.Format(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=0\""),pFile);
exclConn->Open(connStr.GetBuffer(),_T(""),_T(""),adModeUnknown);

问题9  fatal error C1900: Il mismatch between 'P1' version '20060201' and 'P2' version '20050411'

一般是引用了高版本编译器生成的LIB导致

1 升级当前编译器版本,例如安装SP1

2 用当前版本编译器重新编译LIB

问题10 error C2872: 'CCriticalSection' : ambiguous symbol

could be afxmt.h(150) : CCriticalSection' or atlsync.h(31) : ATL::CCriticalSection'

解决:在使用到CCriticalSection的地方,加入以下这段

#include <afxmt.h>
typedef CCriticalSection AfxmtCriticalSection;
typedef CEvent AfxmtEvent;
#include <atlsync.h>

问题11 使用ADO操作Excel时候,关闭_RecordsetPtr 报错

try
{
m_pRecordset->State&adStateOpen;
m_pRecordset->AddNew();
m_pRecordset->PutCollect("old",_variant_t((long)28);
……
m_pRecordset->GetFields()->GetItem("data")->AppendChunk(varBLOB);
m_pRecordset->Update(); //语句A ,这很重要 就是因为没有Update导致 Close报错
}
catch (_com_error e)
{
m_pRecordset->Close(); //语句B
……
}

问题12 WPS OFFICE 冲突,error C4772: #import referenced a type from a missing type library; '__missing_type__'

解决方法转自 https://blog.csdn.net/godoooo/article/details/84591520

Win + R运行命令:regedit ; 在弹出的注册表编辑器中找到如下选项:
HKEY_CLASSES_ROOT\TypeLib{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5
右边会显示选择的项的信息,右键 --> 删除多余的即可。

问题13 fatal error C1084: Cannot read type library file: 'C:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE': 加载类型库/DLL 时出错。

原因,本身机器Win7 64位系统安装的是x86的office2010,卸载后,陆续装了WPS,与office2010精简版,导致了开发环境出现各种问题,首先我4个版本的VS05,08,10,13的许可都被清空掉了,10跟13可以重新注册,05和08经过修复,重装都一直报各种错误,最后使用Windows install Clean Up 把05跟08的组件都卸载掉才重新安装成功,编译以前正常的代码缺又出现上面的错误。查了很久才确定是TypeLib的注册表被修改过,通过 Microsoft Office 14.0 Object Library关键字搜到了HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}这个注册表,然后仿照Office07的内容重新注册,内容如下

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5]
@="Microsoft Office 14.0 Object Library"
"PrimaryInteropAssemblyName"="Office, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5\0]

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5\0\win32]
@="C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE14\\MSO.DLL"

[HKEY_CLASSES_ROOT\Wow6432Node\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.5\FLAGS]
@="0"
至此,问题解决。

问题14 fatal error C1083: Cannot open include file: 'type_traits': No such file or directory

解决方法:需要给vs2008打个sp1的补丁

问题:fatal error C1083: 无法打开包括文件:“AcTc_i.h”: No such file or directory

解决方法:没有包含ObjectARX 2010\inc-win32目录

问题15 fatal error C1083: 无法打开包括文件:“atlsoap.h”: No such file or directory

解决方法:替换VC2008 安装目录的 include文件夹

ATL_Server_Source_and_Headers_9_0_70425_Alpha.zip 解压到

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc

问题16 试图执行系统不支持的操作
  

 解决方法:

    CAcModuleResourceOverride res; //(添加此行)
    AcAxDocLock lock;
    acedGetAcadFrame()->SetFocus();//切换焦点 
    DlgSplitZD dlg;
    dlg.DoModal();

问题17 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

将Microsoft Visual Studio 10.0\VC\bin中的cvtres.exe直接删除或改名。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/134750
推荐阅读
  

闽ICP备14008679号